用于大型交叉连接的 Spark scala 分区数据框

Spark scala partition dataframe for large cross joins

我有两个数据帧需要在 20 节点集群上交叉连接。然而,由于它们的大小,简单的交叉连接失败了。我希望对数据进行分区并执行交叉连接,并且正在寻找一种有效的方法。

简单算法

手动将文件 f1 拆分为三个并读入数据帧:df1A, df1B, df1C
手动将文件 f2 拆分为四个并准备好放入数据帧:df2A, df2B, df2C, df2D
交叉连接 df1A X df2A, df1A X df2B,..,df1A X df2D,...,df1C X df2D
将每个交叉连接保存在一个文件中,然后手动将所有文件放在一起。
通过这种方式,Spark 可以并行执行每个交叉连接,并且事情应该会很快完成。

问题

是否有更有效的方法通过将两个文件读入两个数据帧,然后将每个数据帧划分为 3 和 4 "pieces" 并且对于一个数据帧的每个分区与另一个数据帧的每个分区交叉连接数据框?

数据框可以分区为以太范围或散列。

val df1 = spark.read.csv("file1.txt")

val df2 = spark.read.csv("file2.txt")

val partitionedByRange1 = df1.repartitionByRange(3, $"k")
val partitionedByRange2 = df2.repartitionByRange(4, $"k")

 val result =partitionedByRange1.crossJoin(partitionedByRange2);

注意:设置 属性 spark.sql.crossJoin.enabled=true

您可以将其转换为 rdd,然后对该 RDD 使用笛卡尔运算。然后您应该能够将该 RDD 保存到文件中。希望有帮助