#java #apache-spark
#java #apache-искра
Вопрос:
У меня есть приведенный ниже spark dataframe / dataset.
column_1 column_2 column_3 column_4
A,B NameA,NameB F NameF
C NameC NULL NULL
NULL NULL D,E NameD,NULL
G NULL H NameH
I NameI J NULL
Все вышеперечисленные 4 столбца разделены запятыми. Я должен преобразовать это в новый dataframe / dataset, который содержит только 2 столбца и без каких-либо разделителей через запятую. Значение в column_1 и соответствующее ему имя в Column_2 должны быть записаны в output. Аналогично для column_3 и column_4. Если оба столбца равны column_1, а column_2 равны null, они не требуются в выходных данных.
Ожидаемый результат:
out_column_1 out_column_2
A NameA
B NameB
F NameF
C NameC
D NameD
E NULL
G NULL
H NameH
I NameI
J NULL
Есть ли способ добиться этого в Java spark без использования UDF?
Ответ №1:
Решение Scala — я думаю, должно работать на Java. По сути, просто обрабатывайте col1, col2 отдельно от col3, col4 и объединяйте результаты. Много споров с массивами.
// maybe replace this with Dataset<Row> result = ... in Java
val result = df.select(
split(col("column_1"), ",").alias("column_1"),
split(col("column_2"), ",").alias("column_2")
).filter(
"column_1 is not null"
).select(
explode(
arrays_zip(
col("column_1"),
coalesce(col("column_2"), array(lit(null)))
)
)
).select(
"col.*"
).union(
df.select(
split(col("column_3"), ",").alias("column_3"),
split(col("column_4"), ",").alias("column_4")
).filter(
"column_3 is not null"
).select(
explode(
arrays_zip(
col("column_3"),
coalesce(col("column_4"), array(lit(null)))
)
)
).select("col.*")
).toDF(
"out_column_1", "out_column_2"
)
result.show
------------ ------------
|out_column_1|out_column_2|
------------ ------------
| A| NameA|
| B| NameB|
| C| NameC|
| G| null|
| I| NameI|
| F| NameF|
| D| NameD|
| E| null|
| H| NameH|
| J| null|
------------ ------------
Комментарии:
1. Спасибо. Я внес небольшие изменения в Java Spark, и все сработало так, как ожидалось