将列表中的 n 个 DF 合并到单个 DataFrame - Scala

Posted

技术标签:

【中文标题】将列表中的 n 个 DF 合并到单个 DataFrame - Scala【英文标题】:Merge n DF's in a list to a single DataFrame - Scala 【发布时间】:2020-10-29 08:29:58 【问题描述】:

我正在尝试将 1000 个 DataFrame 合并到单个 DF 中,该 DF 以 Seq[org.apache.spark.sql.DataFrame] 作为列表存在。所以我使用了类似下面的东西,x 是 Dataframes 的列表:

val y = x.reduce(_ union _)

但它需要永恒的时间才能完成。

还有其他有效的方法来完成上述任务吗?也许通过编码甚至通过 Spark 配置设置对其进行优化?

非常感谢任何帮助。

【问题讨论】:

尝试分阶段进行(所以说 sqrt(1000) 数据帧并将它们写出来,然后读入)。 尝试为每 40 到 50 个数据帧做一些检查点。再次阅读它们并尝试再次联合它们。关键是检查血统图,如果它很大,试着打破它 ***.com/questions/37612622/… 最后转换为RDD并返回DF? 【参考方案1】:

首先我会尝试“批量”联合,有时这会有所帮助:

dfs.grouped(50)
.map(dfss => dfss.reduce(_ union _))
.reduce(_ union _)

如果这还不够,您可以尝试使用检查点:

dfs.grouped(50)
.map(dfss => dfss.reduce(_ union _).checkpoint(true))
.reduce(_ union _)

如果数据帧相当小,您还可以通过在内部map 中使用dfss.reduce(_ union _).coalesce(1) 来减少分区数(这是数据帧所有分区的总和)

【讨论】:

以上是关于将列表中的 n 个 DF 合并到单个 DataFrame - Scala的主要内容,如果未能解决你的问题,请参考以下文章

如何将日期,年,月的不同列合并/合并到单个列中

如何将列表项附加到数据框中的特定列?

将重复记录合并到 pyspark 数据框中的单个记录中

以最少的比较将列表列表合并为单个列表

GroupBy并合并到java中的单个列表中

如何将年、月和日列合并到单个日期时间列?