我有一个Seq
Spark数据帧(即Seq[org.apache.spark.sql.DataFrame]
),它可能包含1个或多个元素。
每个数据框都有一个列列表,每个数据帧还有一些额外的列。我想做的是使用连接条件中的那些公共列将所有这些数据帧连接在一起(记住,数据帧的数量是未知的)
如何将所有这些数据框架连接在一起?我想我可以foreach
超过他们,但这看起来并不优雅。任何人都可以想出一个更实用的方法吗? 编辑:递归函数会比foreach更好,我现在正在处理它,将在完成后将其发布到。
以下是一些代码,用于创建n个数据帧的列表(在本例中为n = 3),每个数据帧包含id
列& Product
:
import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._
val conf = new SparkConf().setMaster("local[*]")
val spark = SparkSession.builder().appName("Feature Generator tests").config(conf).config("spark.sql.warehouse.dir", "/tmp/hive").enableHiveSupport().getOrCreate()
val df = spark.range(0, 1000).toDF().withColumn("Product", concat(lit("product"), col("id")))
val dataFrames = Seq(1,2,3).map(s => df.withColumn("_" + s.toString, lit(s)))
要澄清,dataFrames.head.columns
会返回Array[String] = Array(id, Product, _1)
。
我如何将这些n个数据帧加在列id
&上。 Product
以便返回的数据框具有列Array[String] = Array(id, Product, _1, _2, _3)
?
答案 0 :(得分:2)
dataFrames
是List
;您可以使用List.reduce
方法加入内部的所有数据框:
dataFrames.reduce(_.join(_, Seq("id", "Product"))).show
//+---+---------+---+---+---+
//| id| Product| _1| _2| _3|
//+---+---------+---+---+---+
//| 0| product0| 1| 2| 3|
//| 1| product1| 1| 2| 3|
//| 2| product2| 1| 2| 3|
//| 3| product3| 1| 2| 3|
//| 4| product4| 1| 2| 3|
//| ... more rows