售点POI标签计算性能优化实战:Haversine公式与区域化计算的结合

售点POI标签计算脚本性能优化:从UDF到Spark算子的高效转换

在数据处理的领域中,性能优化是一个永恒的话题。特别是在处理大规模数据集时,如何高效地执行计算任务成为了每个数据工程师必须面对的挑战。本文将分享我们在售点POI标签计算脚本性能优化中的一些实践和思考,特别是如何通过减少UDF函数的使用和优化数据计算量来提升整体性能。

1. 减少UDF函数的使用,拥抱Spark算子

在Spark中,UDF(用户定义函数)虽然提供了灵活性,但其执行效率往往不如内置的Spark算子。特别是在处理大规模数据时,UDF的性能瓶颈尤为明显。因此,我们决定尽量减少UDF的使用,转而使用Spark的内置算子来执行计算任务。

1.1 使用Haversine公式计算距离

对于两组经纬度的距离计算,我们采用了Haversine公式。Haversine公式是一种用于计算两个球面坐标点(经度和纬度)之间距离的经典方法。其原理基于球面三角形中的余弦定理,能够高效地计算出两点之间的球面距离。

python 复制代码
poi_outlet = poi_outlet.withColumn("dlat", radians(poi_outlet["LATITUDE"]) - radians(poi_outlet["lat"]))
poi_outlet = poi_outlet.withColumn("dlon", radians(poi_outlet["LONGITUDE"]) - radians(poi_outlet["lng"]))
poi_outlet = poi_outlet.withColumn("a",
                   sin(poi_outlet["dlat"]/2)**2 +
                   cos(radians(poi_outlet["LATITUDE"])) * cos(radians(poi_outlet["lat"])) *
                   sin(poi_outlet["dlon"]/2)**2)
poi_outlet = poi_outlet.withColumn("distance", 2 * asin(sqrt(poi_outlet.a))*6371.393*1000)

通过这种方式,我们避免了使用外部库(如geopy)来计算距离,从而减少了不必要的开销。

2. 减少需要计算的数据量

在大规模数据处理中,减少计算量是提升性能的关键。我们通过以下两种方式有效地减少了数据计算量:

2.1 筛除无效数据

首先,我们对售点数据和腾讯POI数据进行了筛选,剔除了那些没有经纬度信息的记录。这一步骤显著减少了需要处理的数据量:

  • 售点数据:从1,650,654条减少到1,167,357条
  • 腾讯POI数据:从30,498,558条减少到29,607,224条

2.2 区域化计算

为了进一步减少计算量,我们以每个售点的经纬度为中心,划定了一个1500米的范围。通过这种方式,我们只计算该范围内的POI数据,从而大幅减少了整体的计算量。

python 复制代码
# _lon_res = round(0.0011141771746803184 * 15, 5)  0.01671
# _lat_res = round(0.0009034837993532672 * 15, 5)  0.01355
poi_outlet = poi_outlet.filter(
    (poi_outlet.lng.isNotNull()) & (poi_outlet.LONGITUDE.isNotNull()) &
    (poi_outlet.lat.isNotNull()) & (poi_outlet.LATITUDE.isNotNull()) &
    (expr("abs(lng - LONGITUDE) <= 0.01671")) &
    (expr("abs(lat - LATITUDE) <= 0.01355"))
)

3. 总结

通过减少UDF函数的使用和优化数据计算量,我们成功地提升了售点POI标签计算脚本的性能。这不仅减少了计算时间,还降低了资源消耗,为后续的数据处理任务奠定了坚实的基础。

在未来的工作中,我们将继续探索更多的性能优化方法,以应对日益增长的数据处理需求。希望本文的分享能够为你在数据处理中的性能优化提供一些启发和帮助。

相关推荐
千里马学框架2 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
liangshanbo12152 天前
React 性能优化实战
性能优化·react
mmsx2 天前
Android GIS系列 内存加锁、SQLite 开事务:矢量数据集双层并发设计
android·性能优化·app
Pioneer000013 天前
我用 Redis + 网关做多模型 API 路由:缓存命中率 95%+ 的工程实践
人工智能·redis·后端·缓存·性能优化·架构
ZFJ_张福杰3 天前
【Flutter】Flutter 中有哪些耗时操作?从 UI 卡顿到 Isolate 性能优化
flutter·性能优化·卡顿·isolate
政企项目老覃3 天前
金融转账“幽灵失败“排查实录:从本地消息表到 Seata TCC 的选型与权衡
数据库·程序人生·性能优化·数据分析·系统架构
爱喝水的鱼丶3 天前
SAP-ABAP:MM 模块供应商主数据开发:字段扩展、分级管控与同步接口开发
开发语言·性能优化·接口·sap·abap·增强·经验交流
贾伟康3 天前
【HarmonyOS 7新能力|050】Core File Kit mmap工程封装:把接入逻辑放进可维护的分层结构
性能优化·harmonyos·arkts·文件系统·mmap
贾伟康3 天前
【HarmonyOS 7新能力|045】LazyLayoutAlgorithm工程封装:把接入逻辑放进可维护的分层结构
性能优化·harmonyos·arkts·arkui·懒加载
打工仔折腾 AI3 天前
数据库上 K8s 之后谁来管?拆解金仓 KES-Operator 的声明式运维方案
人工智能·后端·python·性能优化·ai agent 实战