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

优化两个大型pyspark数据帧的连接

梁丘逸仙
2023-03-14

我有两个包含GB数据的大型pyspark数据框df1和df2。第一个数据框中的列是id1,col1。第二个数据框中的列是id2,col2。数据框的行数相等。id1和id2的所有值都是唯一的。id1的所有值也正好对应一个值id2。

因为。前几个条目与df1和df2区域相同,如下所示

DF1:

 id1 |  col1
  12 |  john
  23 |  chris
  35 |  david

df2:

id2  |   col2
 23  |  lewis
 35  |  boon
 12  |  cena

所以我需要连接键 id1 和 id2 上的两个数据帧。df = df1.join(df2, df1.id1 == df2.id2) 恐怕这可能会受到洗牌的影响。如何针对此特殊情况优化连接操作?

共有1个答案

云宾鸿
2023-03-14

为了避免联接操作时的混乱,请根据您的id列重新排列数据。

重新洗牌操作也将进行完全洗牌,但如果有多个加入,它将优化您的进一步加入。

df1 = df1.repartition('id1')
df2 = df2.repartition('id2')

避免联接时随机播放的另一种方法是利用存储桶。

通过在id上使用bucketBy子句来保存两个数据帧,然后当稍后读取数据帧时,id列将驻留在相同的执行器中,从而避免了混洗。

但是,为了利用bucketing的好处,您需要一个蜂巢元存储,因为其中包含bucketing信息。

此外,这将包括创建存储桶然后读取的额外步骤。

 类似资料:
  • 假设我有两个数据帧,具有不同级别的信息,如下所示: 我想加入df1和df2,并将“值”信息传递给df2:一天中的每一小时都将获得“日”值。 预期产出:

  • 我有一个PySpark数据帧,df1,看起来像: 我有第二个PySpark数据帧,df2 我想将df1的所有列(我有两列以上)与客户ID上的df2连接值相乘

  • 我有两个火花数据帧。我想基于第二个更新第一个。 数据流1 df2 我想更新第一个数据帧(df1),如下所示 我不知道如何加入嵌套结构中的数据

  • 我有两个数据帧,DF1和DF2,DF1是存储来自DF2的任何附加信息的主机。 假设DF1是以下格式, DF2包含DF1中已经存在的2个条目和两个新条目。(itemId和item被视为一个组,可以被视为连接的键) 我需要合并两个数据框,以便增加现有项目计数并插入新项目。 结果应该是这样的: 我有一种方法可以做到这一点,但不确定这种方法是否有效或正确

  • 我正在尝试在 pyspark 中连接两个数据帧,但将一个表作为数组列连接在另一个表上。 例如,对于这些表: 我想在列和上将df1连接到df2,但和应该是单个数组类型列。此外,应保留所有名称。新数据框的输出应该能够转换为此json结构(例如前两行): 任何关于如何实现这一目标的想法都将不胜感激! 谢谢, 卡罗莱纳州

  • 我有一个PySpark数据帧,df1,看起来像: 我有第二个PySpark数据帧,df2 我想得到两个数据帧的余弦相似性。并有类似的东西