Преобразование массивов в набор данных Spark в Scala - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь создать DataSet из 4-х массивов. У меня есть такие массивы:

// 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 массива имеют равный размер, и для заполнения первого массива столбец-rawValue другого набора данных преобразуется в массив, как показано выше.

После выполнения всех вычислений я хочу создать DataSet, который имеет 4 отдельных столбца, и каждый столбец представляет более 4 отдельных массивов.

Итак, в принципе, как я могу создать набор данных из массивов? Я изо всех сил пытаюсь сделать то же самое.

Пожалуйста, помогите.

1 Ответ

1 голос
/ 08 мая 2020

Вам просто нужно объединить их вместе в Sequnce:

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, если массивы имеют разный размер.

EDIT:

Я не уверен в том, как поток данных течет вниз, но если вы пытаетесь создать все 4 массива из DataFrame, я бы посоветовал вам преобразовать их в DataFrame вместо того, чтобы использовать этот подход (особенно если Data размер большой).

...