scala - 如何在 Scala 中将 Spark 数据帧列表连接在一起?

标签 scala apache-spark

我有一个 Seq Spark 数据帧(即 Seq[org.apache.spark.sql.DataFrame] ),它可以包含 1 个或多个元素。
每个数据框都有一个列列表,每个数据框还有一些额外的列。我想做的是使用连接条件中的那些公共(public)列将所有这些数据框连接在一起(请记住,数据框的数量是未知的)

如何将所有这些数据框连接在一起?我想我可以 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) .

我如何在列 id 上将这 n 个数据帧连接在一起& Product以便返回的数据帧具有列 Array[String] = Array(id, Product, _1, _2, _3) ?

最佳答案

dataFramesList ;您可以使用 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

关于scala - 如何在 Scala 中将 Spark 数据帧列表连接在一起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50359939/

相关文章:

eclipse - 链接到 Eclipse 中 Scala 解析器组合器的库

java - 如何加载训练好的RandomForestClassificationModel模型?

java - Spark RDD MEMORY_AND_DISK_2() 中的存储级别抛出异常

scala - 在 Scala 中调用 collect() 函数时出现异常

scala - 使用 Slick 的代码生成器时,如何过滤列?

scala - 如何关闭akka ActorSystem中的调度程序线程

memory - Spark Worker 请求大量虚拟内存

apache-spark - Spark - Master : got disassociated, 删除它

image - Scala Swing 图像

scala - 如果 `for` 中的至少一个组件为 None,则 for-comprehension 返回 None