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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用于大型交叉连接的Spark scala分区数据框相关的知识,希望对你有一定的参考价值。

我有两个需要在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个“片段”,并将一个数据帧的每个分区与另一个数据帧的每个分区交叉连接?

答案

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

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保存到文件中。希望有所帮助

以上是关于用于大型交叉连接的Spark scala分区数据框的主要内容,如果未能解决你的问题,请参考以下文章

Scala(Spark)连接数据框中的列[重复]

使用 Spark Scala 连接两个数据框

NotNull 条件不适用于 spark 数据框 scala 中的 withColumn 条件

高级连接两个数据框 spark scala

如何在scala spark中将数据框的特定列与另一个列连接[重复]

如何从 Scala Spark 中的 Excel (xls,xlsx) 文件构造数据框?