apache-spark - 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实际上会交叉连接所有数据。我怎样才能让它只做分区间连接而不是分区内连接?
解决方案
在大量使用数据之后,spark 似乎足够聪明,可以首先确保在相等条件(“geohash7”)上发生连接。因此,如果那里没有匹配,它将不会计算“dist”函数。似乎在相等条件下,它不再进行交叉连接。所以我不必做任何其他事情。上面的连接工作正常。
推荐阅读
- azure - Azure 数据工厂 - 如何处理来自 Microsoft 图形 REST 源的 CSV 数据
- vba - 如何在 MS Word 中为我现有的 VB 代码添加条件格式?
- postgresql - 如果我对 PK 使用约束会发生什么?
- reactjs - amcharts中如何更改图表的背景颜色
- javascript - 如何在脚本中停止 .getvalues() 超过例如 10 秒
- docker - 在 Windows docker 容器中合并拆分文件
- c# - 应用控制模板修改
- javascript - 使用 jQuery 在 li 上设置一个值
- python - 奇怪的布尔行为:具有多个元素的数组的真值不明确
- reactjs - React-redux-firebase:未捕获的错误:提供的 prop/s “调度”保留用于内部 firebaseConnect() 使用