当前位置: 首页 > 知识库问答 >
问题:

Spark如何仅在分区内连接

南宫奇思
2023-03-14

我有两个大的数据帧。每一行都有lat/lon数据。我的目标是在两个数据帧之间进行连接,并找到距离内的所有点,例如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实际上会交叉连接所有数据。如何使其只执行分区间连接而不执行分区内连接?

共有1个答案

微生雨泽
2023-03-14

在玩了很多数据之后,spark似乎足够聪明,可以首先确保在相等条件(“geohash7”)下进行连接。因此,如果没有匹配,它就不会计算“dist”函数。同样,在相等条件下,它不再进行交叉连接。所以我不需要做其他事情。上面的连接很好。

 类似资料:
  • 我已经通过Kafka将数据按键排序到我的Spark流分区中,即在一个节点上找到的键在任何其他节点上都找不到。 我希望使用redis及其(increment by)命令作为状态引擎,并且为了减少发送到redis的请求数,我希望通过在每个工作节点上进行字数计数来部分减少数据。(关键是标签+时间戳,从字数中获取我的功能)。我希望避免洗牌,让redis负责跨工作节点添加数据。 即使我检查了数据在工作节点之

  • 我有以下制表符分隔的示例数据集: 我正在对此数据运行一些转换,最终数据位于spark dataset中。之后,我用“period”分区将该数据集写入s3。因为我也希望在s3文件中使用period,所以我正在从from period列创建另一列“datasetperiod”。 我的scala函数来保存TSV数据集。 在S3上保存数据集的Scala代码。为S3上的分区添加新列datasetPeriod

  • 假设我正在从S3文件夹中读取100个文件。每个文件的大小为10 MB。当我执行<code>df=spark.read时。parquet(s3路径),文件(或更确切地说分区)如何在任务之间分布?E、 g.在这种情况下,<code>df</code>将有100个分区,如果spark有10个任务正在运行以将该文件夹的内容读取到数据帧中,那么这些分区是如何分配给这10个任务的?它是以循环方式进行的,还是每

  • 我想在我的spark rdd上做一个映射, 但是,这给了我一个已经关闭的连接异常,正如预期的那样,因为在控件到达之前,我的是关闭的。我想为每个RDD分区创建一个连接,并正确地关闭它。我如何实现这一点? 谢谢

  • 具有以下日志输出: 我想知道有什么方法可以增加SQL输出的分区大小。

  • 我需要一些帮助来了解spark如何决定分区的数量,以及它们在executors中是如何处理的,我很抱歉这个问题,因为我知道这是一个重复的问题,但即使在阅读了许多文章后,我仍然不能理解我正在放上一个我目前正在工作的真实生活用例,以及我的Spark提交配置和集群配置。 我的硬件配置: < code>3节点计算机,总Vcores=30,总内存=320 GB。 我正在使用spark dataframe J