首页 > 解决方案 > Spark如何仅在分区内加入

问题描述

我有 2 个大数据框。每行都有纬度/经度数据。我的目标是在 2 个数据帧之间进行连接,并找到距离内的所有点,例如 100m。

df1: (id, lat, lon, geohash7)
df2: (id, lat, lon, geohash7)

我想在 geohash7 上对 df1 和 df2 进行分区,然后只在分区内加入。我想避免在分区之间加入以减少计算。

df1 = df1.repartition(200, "geohash7")
df2 = df2.repartition(200, "geohash7")

df_merged = df1.join(df2, (df1("geohash7")===df2("geohash7")) & (dist(df1("lat"),df1("lon"),df2("lat"),df2("lon"))<100) )

所以基本上加入geohash7,然后确保点之间的距离小于100。问题是,Spark实际上会交叉连接所有数据。我怎样才能让它只做分区间连接而不是分区内连接?

标签: apache-sparkapache-spark-sqlpartitioning

解决方案


在大量使用数据之后,spark 似乎足够聪明,可以首先确保在相等条件(“geohash7”)上发生连接。因此,如果那里没有匹配,它将不会计算“dist”函数。似乎在相等条件下,它不再进行交叉连接。所以我不必做任何其他事情。上面的连接工作正常。


推荐阅读