繁体   English   中英

如何在没有直接连接列的两个数据框之间找到最接近的匹配行?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM