Apache spark 火花>;2-联接操作期间的自定义分区键

Apache spark 火花>;2-联接操作期间的自定义分区键,apache-spark,join,apache-spark-sql,Apache Spark,Join,Apache Spark Sql,我想知道我们是否可以强制Spark在两个数据帧的连接操作期间使用自定义分区键 例如,让我们考虑一下 df1: DataFrame - [groupid, other_column_a] df2: DataFrame - [groupid, other_column_b] 如果我跑 df_join = df1.join(df2, "groupid") Spark将“groupid”设置为分区键,并在每个分区上执行连接。问题是,如果分区太大,这可能会耗尽计算机上的内存 但是,从理论上讲,可以使用

我想知道我们是否可以强制Spark在两个数据帧的连接操作期间使用自定义分区键

例如,让我们考虑一下

df1: DataFrame - [groupid, other_column_a]
df2: DataFrame - [groupid, other_column_b]
如果我跑

df_join = df1.join(df2, "groupid")
Spark将“groupid”设置为分区键,并在每个分区上执行连接。问题是,如果分区太大,这可能会耗尽计算机上的内存

但是,从理论上讲,可以使用say
(groupid,other\u column\u a)
作为分区键来执行连接(以减小每个分区的大小)

有可能用Spark来做吗?我试着去做
df1.repartition(“group\u id”,“other\u column\u a”)
但是这被连接覆盖(我用
df\u join.explain()检查它)。我在网上找不到任何资源来解释如何做到这一点

谢谢

但是,从理论上讲,似乎可以使用say(groupid,other_column_a)执行连接

那是不对的。要执行连接,Spark必须将所有具有
groupid
的记录移动到单个分区,因此在以下情况下可以使用(groupid,other_column_a):

  • (groupid,其他列)
    其中连接键
  • 其他列与
    组id
    之间存在功能性关系
第一个条件显然不满足,因为您仅通过
groupid
加入,第二个条件无法解决问题,因为分发情况将相同或更糟


对于倾斜联接,还有其他可能的解决方案,如单独处理倾斜组或迭代广播联接(请参阅中的答案和注释)。

如果您在某个整数列I'd上联接,您可以对数据帧进行分区,I'd模化一些数字。。你想要多少个分区。。这样,共享一些公共哈希值的id将被分组到一个分区中。。然后,您可以通过分解为多个联接来执行联接。。在循环中串行连接每个分区。。我已经详细解释了这个案子

嗨!感谢您的回答,但是我不清楚为什么“Spark必须将所有具有groupid的记录移动到单个分区”。您能解释一下逻辑或发送一个链接来解释这一点吗?我刚刚添加了一张图片来附带我的问题谢谢您的回答!感觉它应该起作用。不过,这样做很麻烦。我很好奇为什么在Spark中这样做不容易!您还可以使用glom和spark partition I-d方法来查看行在每个分区中的分布情况。。如果您需要详细信息,请告诉我this@vikrantrana我有一些关于partitioner的问题,也许我会问你,如果我找不到答案。顺便说一句,我今天在
PySpark
:)中处理定制的分区程序