Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 优化两个大型pyspark数据帧的连接_Apache Spark_Join_Pyspark_Apache Spark Sql - Fatal编程技术网

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

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) 我担心这可能会受到洗牌的影响。 如何针对这种特殊情况优化联接

我有两个大的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