用于大型交叉连接的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分区数据框的主要内容,如果未能解决你的问题,请参考以下文章
NotNull 条件不适用于 spark 数据框 scala 中的 withColumn 条件