Преобразуйте каждое значение набора данных Java spark в строку, используя explode (). - PullRequest
1 голос
/ 04 марта 2020

Я хочу преобразовать каждое значение набора данных spark (скажем, 'x' строк и 'y' столбцов) в отдельные строки (результат должен быть x * y строк) с дополнительным столбцом.

Например, ,

ColA    ColB    ColC

 1        2       3
 4        5       6

Должно произвести,

NewColA NewColB

   1      ColA
   4      ColA
   2      ColB
   5      ColB
   3      ColC
   6      ColC    

Значения в NewColB взяты из исходного столбца значения в NewColA, то есть значения 1 и 4 имеют значения как ColA в NewColB, потому что они изначально пришел из ColA и т. д.

Я видел несколько реализаций функции explode () в Java, но я хочу знать, как ее можно использовать в моем случае использования. Также обратите внимание, что размер ввода может быть большим (x * y может быть в миллионах).

1 Ответ

1 голос
/ 04 марта 2020

Самый простой способ выполнить sh это с помощью функции stack(), встроенной для зажигания sql.

val df = Seq((1, 2, 3), (4, 5, 6)).toDF("ColA", "ColB", "ColC")
df.show()

+----+----+----+
|ColA|ColB|ColC|
+----+----+----+
|   1|   2|   3|
|   4|   5|   6|
+----+----+----+

val df2 = df.select(expr("stack(3, ColA, 'ColA', ColB, 'ColB', ColC, 'ColC') as (NewColA, NewColB)"))
df2.show()

+-------+-------+
|NewColA|NewColB|
+-------+-------+
|      1|   ColA|
|      2|   ColB|
|      3|   ColC|
|      4|   ColA|
|      5|   ColB|
|      6|   ColC|
+-------+-------+

извините, примеры приведены в scala, но его легко перевести

Также возможно, хотя и более сложно и менее эффективно сделать это с .flatMap().

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