【问题标题】:Convert Arrays into Spark DataSet in Scala在 Scala 中将数组转换为 Spark 数据集
【发布时间】:2020-05-10 23:02:25
【问题描述】:

我正在尝试从 4 个数组创建一个 DataSet。我有这样的数组:

// Array 1
val rawValues = rawData.select(collect_list("rawValue")).first().getList[Double](0).asScala.toArray

// Array 2 
var trendValues = Array[Double]()

// Array 3 
var seasonalValues = Array[Double]()

// Array 4     
var remainder = Array[Double]()

我根据第一个数组上的一些计算(此处未包括)填充了最后 3 个数组。所有 4 个数组的大小都相同,为了填充第一个数组,另一个数据集的 column-rawValue 被转换为一个数组,如上所示。

完成所有计算后,我想创建一个 DataSet,它有 4 个独立的列,每列代表 4 个独立的数组。

那么,基本上如何从数组创建数据集?我也在努力做同样的事情。

请帮忙。

【问题讨论】:

  • 为什么要将数据集转换为数组,您可以将数组转换为数据集并将所有数据集连接在一起吗?
  • 为了创建array1,我使用了一个数据集的特定列,我需要在该列上应用各种操作来进一步计算其他3个数组。所以,最后我将有 4 个数组,需要将这 4 个数组转换为数据集中的 4 个特定列。
  • 好的,您可以为您想要的那些和最终输出添加示例数据吗?

标签: arrays scala apache-spark apache-spark-dataset


【解决方案1】:

您只需将它们组合成一个序列即可:

case class ArrayMap(rawValues: Double, trendValues: Double, seasonalValues: Double, remainder: Double)

import spark.implicits._
val data = for(i <- arr1.indices) yield ArrayMap(arr1(i), arr2(i) ,arr3(i) ,arr4(i))
data.toDF()

//or else, but takes more steps
arr1.zip(arr2).zip(arr3).zip(arr4)
  .map(a => ArrayMap(a._1._1._1, a._1._1._2, a._1._2, a._2))
  .toSeq.toDF()

如果数组大小不同,请使用zipAll

编辑:

我不确定数据如何向下流动的用例,但如果您尝试从 DataFrame 创建所有 4 个数组,我建议您在 DataFrame 中对其进行转换,而不是采用这种方法(特别是如果数据大小很大)。

【讨论】:

  • 您能否提出一种方法,我可以先定义架构,然后根据架构将所有数组放入数据集中?
  • 将它们映射到一个案例类而不是元组。 case ArrayCol(第一个:Double,第二个:String,...)。它看起来像 Seq(ArrayCol).toDF()
  • 您可以根据您的最新评论修改您的答案。如果它有效,我会接受它。谢谢
  • 在您给出的“或其他”选项中,toDF() 不起作用。即在 toSeq 之后,我没有得到 toDF()。我正在寻找转换成数据集
  • 抱歉,我做错了。有用。我认为在您的回答中,您还应该比较您提供的两个选项之间的差异,并指出应该使用哪个选项来提高效率和速度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-24
  • 2018-12-05
  • 2018-07-16
  • 1970-01-01
  • 1970-01-01
  • 2019-07-23
  • 1970-01-01
相关资源
最近更新 更多