如何在Scala中将Spark数据帧列表连接在一起?
我有一个Spark数据帧的如何在Scala中将Spark数据帧列表连接在一起?,scala,apache-spark,Scala,Apache Spark,我有一个Spark数据帧的Seq(即Seq[org.apache.Spark.sql.DataFrame]),它可以包含一个或多个元素。 每个数据帧都有一个公共列列表,每个数据帧还具有一些附加列。我想做的是使用连接条件中的公共列将所有这些数据帧连接在一起(记住,数据帧的数量是未知的) 如何将所有这些数据帧连接在一起?我想我可以用foreachover他们,但这似乎不是很优雅。有人能想出一个更实用的方法吗?编辑:递归函数比foreach更好,我现在正在研究,完成后将在这里发布 下面是一些代码,用于
Seq
(即Seq[org.apache.Spark.sql.DataFrame]
),它可以包含一个或多个元素。
每个数据帧都有一个公共列列表,每个数据帧还具有一些附加列。我想做的是使用连接条件中的公共列将所有这些数据帧连接在一起(记住,数据帧的数量是未知的)
如何将所有这些数据帧连接在一起?我想我可以用foreach
over他们,但这似乎不是很优雅。有人能想出一个更实用的方法吗?编辑:递归函数比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)
我如何在
id
列和Product
列上将这n个数据帧连接在一起,以便返回的数据帧具有Array[String]=Array(id,Product,_1,_2,_3)
?数据帧是一个列表
;您可以使用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
当我们有一个庞大的数据帧列表要加入时,这就不起作用了。