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

问题描述 投票:0回答:2

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

apache-spark dataframe cross-join
2个回答
0
投票

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

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


-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.