处理依赖于 Spark 数据集中另一列的逗号分隔列

Posted

技术标签:

【中文标题】处理依赖于 Spark 数据集中另一列的逗号分隔列【英文标题】:Handling comma delimited columns with dependency on another column in Spark dataset 【发布时间】:2021-01-08 08:16:52 【问题描述】:

我有以下 spark 数据帧/数据集。

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 列均以逗号分隔。我必须将其转换为只有 2 列且没有任何逗号分隔符的新数据框/数据集。 column_1 中的值及其在 Column_2 中的相应名称应写入输出。对于 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

有没有办法在不使用 UDF 的情况下在 Java spark 中实现这一点?

【问题讨论】:

【参考方案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|
+------------+------------+

【讨论】:

谢谢。我对 Java Spark 做了一些小改动,它按预期工作

以上是关于处理依赖于 Spark 数据集中另一列的逗号分隔列的主要内容,如果未能解决你的问题,请参考以下文章

EXCEL中如何把一列数据变为多列?

怎么用excel把一列变成两列

如何根据另一列的值从 Spark DataFrame 中选择特定列?

如何使一个材料表列的编辑模式字段类型依赖于另一列的值,而不影响其他行?

Scala Spark,比较两个 DataFrame 并选择另一列的值

Mysql 条件 MAX 或 MIN 依赖于另一列值