Apache spark 优化两个大型pyspark数据帧的连接
我有两个大的pyspark数据帧df1和df2,其中包含GBs的数据。 第一个数据帧中的列是id1,col1。 第二个数据帧中的列是id2,col2。 数据帧的行数相等。 此外,id1和id2的所有值都是唯一的。 此外,id1的所有值都恰好对应于一个值id2 因为。以下是df1和df2区域的前几个条目 df1: df2: 所以我需要连接键id1和id2上的两个数据帧。 df=df1.join(df2,df1.id1==df2.id2) 我担心这可能会受到洗牌的影响。Apache spark 优化两个大型pyspark数据帧的连接,apache-spark,join,pyspark,apache-spark-sql,Apache Spark,Join,Pyspark,Apache Spark Sql,我有两个大的pyspark数据帧df1和df2,其中包含GBs的数据。 第一个数据帧中的列是id1,col1。 第二个数据帧中的列是id2,col2。 数据帧的行数相等。 此外,id1和id2的所有值都是唯一的。 此外,id1的所有值都恰好对应于一个值id2 因为。以下是df1和df2区域的前几个条目 df1: df2: 所以我需要连接键id1和id2上的两个数据帧。 df=df1.join(df2,df1.id1==df2.id2) 我担心这可能会受到洗牌的影响。 如何针对这种特殊情况优化联接
如何针对这种特殊情况优化联接操作?为了避免联接操作时的混乱,请根据您的id列重新排列数据 重新洗牌操作也将进行完全洗牌,但如果有多个加入,它将优化您的进一步加入
df1=df1.重新分区('id1')
df2=df2.重新分区('id2')
另一种避免加入时混乱的方法是利用bucketing
通过使用id上的bucketBy子句保存这两个数据帧,然后稍后当您读取数据帧时,id列将驻留在相同的执行器中,从而避免混乱
但为了充分利用bucketing的优势,您需要一个hive元存储,因为bucketing信息包含在其中
此外,这还包括创建存储桶然后读取的附加步骤。我只需执行一次连接。因此,重新分区或bucketing是否会有所帮助,因为它们将以任何方式洗牌数据?
id1 | col1
12 | john
23 | chris
35 | david
id2 | col2
23 | lewis
35 | boon
12 | cena