如何在 Scala 中将 Spark DataFrames 一一添加到 Seq()

Posted

技术标签:

【中文标题】如何在 Scala 中将 Spark DataFrames 一一添加到 Seq()【英文标题】:How to add Spark DataFrames to a Seq() one by one in Scala 【发布时间】:2019-07-02 07:27:57 【问题描述】:

我使用

创建了一个空的 Seq()
scala> var x = Seq[DataFrame]()
x: Seq[org.apache.spark.sql.DataFrame] = List()

我有一个名为 createSamplesForOneDay() 的函数,它返回一个 DataFrame,我想将它添加到这个 Seq() x 中。

val temp = createSamplesForOneDay(some_inputs) // this returns a Spark DF
x = x + temp // this throws an error 

我收到以下错误 -

scala> x = x + temp
<console>:59: error: type mismatch;
 found   : org.apache.spark.sql.DataFrame
    (which expands to)  org.apache.spark.sql.Dataset[org.apache.spark.sql.Row]
 required: String
       x = x + temp

我要做的是使用 for 循环创建一个 Seq() 的数据帧,最后 union 它们都使用这样的东西 -

val newDFs = Seq(DF1,DF2,DF3)
newDFs.reduce(_ union _)

这里提到 - scala - Spark : How to union all dataframe in loop

【问题讨论】:

【参考方案1】:

您不能使用+ 附加到列表,您可以这样附加:

x = x :+ temp

但由于你有一个列表,你应该在你的元素前面添加:

x = temp +: x 

如果您也将输入打包成一个序列,您可以编写更实用的功能,而不是一个一个添加元素:

val inputs = Seq(....) // create Seq of inputs

val x = inputs.map(i => createSamplesForOneDay(i))

【讨论】:

感谢您的回答。它的第一部分就像一个魅力。对于使代码更实用的第二部分,我想做的是,为每一天创建一个 DataFrame 并将其存储在某个地方。因此,Seq() 中的元素数等于循环运行的天数或次数。

以上是关于如何在 Scala 中将 Spark DataFrames 一一添加到 Seq()的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spark Scala 中将 WrappedArray 转换为 List?

Scala - 如何在 Spark SQL 查询中将日期字符串转换为时间戳?

如何在 Spark 2 Scala 中将 Row 转换为 json

如何在 Scala 中将数据帧转换为 Apache Spark 中的数据集?

如何在 Spark Scala 的 UDF 中将列作为值传递以检查条件

如何读取 CSV 文件,然后在 Spark Scala 中将其保存为 JSON?