1 回答

TA貢獻1725條經(jīng)驗 獲得超8個贊
當您可以使用 Spark 內(nèi)置函數(shù)時,不要使用 UDF,因為它們通常性能較差。
這是一個僅使用與您的函數(shù)相同的 Spark SQL 函數(shù)的解決方案:
from pyspark.sql.functions import col, radians, asin, sin, sqrt, cos
df.withColumn("dlon", radians(col("p2_lon")) - radians(col("p1_longitude"))) \
.withColumn("dlat", radians(col("p2_lat")) - radians(col("p1_latitude"))) \
.withColumn("haversine_dist", asin(sqrt(
sin(col("dlat") / 2) ** 2 + cos(radians(col("p1_latitude")))
* cos(radians(col("p2_lat"))) * sin(col("dlon") / 2) ** 2
)
) * 2 * 3963 * 5280) \
.drop("dlon", "dlat")\
.show(truncate=False)
給出:
+-----------+------------+----------+---------+------------------+
|p1_latitude|p1_longitude|p2_lat |p2_lon |haversine_dist |
+-----------+------------+----------+---------+------------------+
|-85.8059 |38.250134 |-85.805122|38.250098|284.13023254857814|
+-----------+------------+----------+---------+------------------+
您可以在此處找到可用的 Spark 內(nèi)置函數(shù)。
添加回答
舉報