对于一组数据框
val df1 = sc.parallelize(1 to 4).map(i => (i,i*10)).toDF("id","x")
val df2 = sc.parallelize(1 to 4).map(i => (i,i*100)).toDF("id","y")
val df3 = sc.parallelize(1 to 4).map(i => (i,i*1000)).toDF("id","z")
团结我所有的人
df1.unionAll(df2).unionAll(df3)
是否有一种更优雅,更可扩展的方式来处理任意数量的数据帧,例如从
Seq(df1, df2, df3)
最简单的解决方案是reduce
使用union
(unionAll
在Spark <2.0中):
val dfs = Seq(df1, df2, df3)
dfs.reduce(_ union _)
这是相对简洁的,不应将数据从堆外存储中移出,但要扩展每个联合的沿袭,需要非线性时间来执行计划分析。如果您尝试合并大量,可能会出现问题DataFrames
。
您还可以转换为RDDs
并使用SparkContext.union
:
dfs match {
case h :: Nil => Some(h)
case h :: _ => Some(h.sqlContext.createDataFrame(
h.sqlContext.sparkContext.union(dfs.map(_.rdd)),
h.schema
))
case Nil => None
}
它使沿袭简短分析的成本较低,但比DataFrames
直接合并效率低。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句