[英]How to find the closest matching rows in between two dataframes that has no direct join columns?
对于 pyspark dataframe 中的每组坐标,我需要在另一个 dataframe 中找到最接近的坐标组
我有一个 pyspark dataframe 坐标数据如下(数据框a):
+------------------+-------------------+
| latitude_deg| longitude_deg|
+------------------+-------------------+
| 40.07080078125| -74.93360137939453|
| 38.704022| -101.473911|
| 59.94919968| -151.695999146|
| 34.86479949951172| -86.77030181884766|
| 35.6087| -91.254898|
| 34.9428028| -97.8180194|
另一个像这样(数据框 b):(仅显示几行以供理解)
+-----+------------------+-------------------+
|ident| latitude_deg| longitude_deg|
+-----+------------------+-------------------+
| 00A| 30.07080078125| -24.93360137939453|
| 00AA| 56.704022| -120.473911|
| 00AK| 18.94919968| -109.695999146|
| 00AL| 76.86479949951172| -67.77030181884766|
| 00AR| 10.6087| -87.254898|
| 00AS| 23.9428028| -10.8180194|
是否有可能以某种方式合并数据帧以产生与 dataframe b 中 dataframe a 中的每一行最接近的标识的结果:
+------------------+-------------------+-------------+
| latitude_deg| longitude_deg|closest_ident|
+------------------+-------------------+-------------+
| 40.07080078125| -74.93360137939453| 12A|
| 38.704022| -101.473911| 14BC|
| 59.94919968| -151.695999146| 278A|
| 34.86479949951172| -86.77030181884766| 56GH|
| 35.6087| -91.254898| 09HJ|
| 34.9428028| -97.8180194| 09BV|
到目前为止我已经尝试过:
我有一个 pyspark UDF 来计算定义的两对坐标之间的半正弦距离。
udf_get_distance = F.udf(get_distance)
它是这样工作的:
df = (df.withColumn(“ABS_DISTANCE”, udf_get_distance(
df.latitude_deg_a, df.longitude_deg_a,
df.latitude_deg_b, df.longitude_deg_b,)
))
我会很感激任何帮助。 非常感谢
你需要先做一个crossJoin。 像这样的东西
joined_df=source_df1.crossJoin(source_df2)
然后你可以像你提到的那样调用你的udf,根据距离生成rownum并过滤掉接近的
from pyspark.sql.functions import row_number,Window
rwindow=Window.partitionBy("latitude_deg_a","latitude_deg_b").orderBy("ABS_DISTANCE")
udf_result_df = joined_df.withColumn(“ABS_DISTANCE”, udf_get_distance(
df.latitude_deg_a, df.longitude_deg_a,
df.latitude_deg_b, df.longitude_deg_b).withColumn("rownum",row_number().over(rwindow)).filter("rownum = 1")
注意:将返回类型添加到您的 udf
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.