Обработка столбцов, разделенных запятыми, с зависимостью от другого столбца в наборе данных Spark

#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, и все сработало так, как ожидалось