优化两个大型pysparkDataframe的连接

92vpleto  于 2021-05-29  发布在  Spark
关注(0)|答案(1)|浏览(402)

我有两个大的pysparkDataframedf1和df2,其中包含gbs的数据。第一个Dataframe中的列是id1,col1。第二个Dataframe中的列是id2,col2。Dataframe的行数相等。另外,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上的两个Dataframe。df=df1.join(df2,df1.id1==df2.id2)恐怕这可能会受到洗牌的影响。如何针对这种特殊情况优化联接操作?

lvmkulzt

lvmkulzt1#

为了避免在执行join操作时进行洗牌,请根据id列重新洗牌数据。
重新洗牌操作也会进行完全洗牌,但如果有多个加入,它会优化您的进一步加入。

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

另一种避免加入时出现混乱的方法是利用bucketing。
通过在id上使用bucketby子句来保存这两个Dataframe,然后在稍后读取Dataframe时,id列将驻留在相同的执行器中,从而避免了洗牌。
但要利用bucketing的好处,您需要一个hive元存储,因为bucketing信息包含在其中。
这还包括创建bucket然后读取的附加步骤。

相关问题