Преобразовать набор данных массива в DataFrame - PullRequest
0 голосов
/ 21 мая 2019

Дано Dataset[Array[String]]. Фактически, эта структура имеет единственное поле типа массива. Есть ли возможность преобразовать его в DataFrame с каждым элементом массива, помещенным в отдельный столбец?

Если у меня есть RDD[Array[String]], я могу добиться этого следующим образом:

val rdd: RDD[Array[String]] = ???
rdd.map(arr => Row.fromSeq(arr))

Но на удивление я не могу сделать то же самое с Dataset[Array[String]] - он говорит, что для Row.

нет кодера.

И я не могу заменить массив на Tuple или case class, потому что размер массива неизвестен во время компиляции.

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Если массивы имеют одинаковый размер, можно использовать «select»:

val original: Dataset[Array[String]] = Seq(Array("One", "Two"), Array("Three", "Four")).toDS()
val arraySize = original.head.size
val result = original.select(
  (0 until arraySize).map(r => original.col("value").getItem(r)): _*)
result.show(false)

Выход:

+--------+--------+
|value[0]|value[1]|
+--------+--------+
|One     |Two     |
|Three   |Four    |
+--------+--------+
1 голос
/ 21 мая 2019

Здесь вы можете сделать foldLeft для создания всех ваших столбцов вручную.

val df = Seq(Array("Hello", "world"), Array("another", "row")).toDS()

Затем вы вычисляете размер вашего массива.

val size_array = df.first.length

Затем вы добавляете столбцы в свой массив.фрейм данных с foldLeft:

0.until(size_array).foldLeft(df){(acc, number) => df.withColumn(s"col$number", $"value".getItem(number))}.show

Здесь наш аккумулятор - это наша df, и мы просто добавляем столбцы один за другим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...