对于售点POI标签计算脚本优化总结

对于售点POI标签计算脚本性能优化总结

  • 减少udf 函数的使用多多使用spark的算子

​ 对于两组经纬度的距离计算可以使用常规的公式计算法:

Haversine 公式是一种用于计算两个球面坐标点(经度和纬度)之间的距离的公式。它的原理是基于球面三角形中的余弦定理,即:

cos© = cos(a) * cos(b) + sin(a) * sin(b) * cos©

其中,a、b 和 c 分别表示球面三角形的三条边所对应的夹角,C 表示球面三角形中两点间的弧长。根据余弦定理,我们可以得出:

cos© = cos(lat1) * cos(lat2) * cos(lon2 - lon1) + sin(lat1) * sin(lat2)

其中,lat1、lat2、lon1 和 lon2 分别表示两个点的纬度和经度。由于我们通常使用角度而非弧度来表示经纬度,因此需要将其转换为弧度。

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)

避免使用外部引用

from geopy.distance import geodesic
distance = geodesic((lat1, lng1), (lat2, lng2)).m
  • 减少需要计算的数据量

    售点数据有:1 650 654,为减少计算量 ,将没有经纬度信息的售点进行筛除。筛除后1 167 357

    腾讯POI数据有:30 498 558,为减少计算量 ,将没有经纬度信息进行筛除。晒出后29 607 224

    整体的数据计算量,以售点经纬度为中心,圈出一个 经度、维度为1500m范围的经纬局域,这样就可以减少后续的计算数据量

# _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"))
)

你可能感兴趣的:(pyspark)