dataframe—spark java中分隔行的多个逗号分隔值

mspsb9vt  于 2021-07-13  发布在  Spark
关注(0)|答案(2)|浏览(366)

我有下面的数据集。 Column_1 是逗号分隔的 Column_2 以及 Column_3 用冒号分隔。都是字符串列。每个逗号分隔的值 Column_1 中应该是一个单独的行 Column_1 以及 Column_2 或者 Column_3 应该填充。或者 column_2 或者 column_3 将被填充,而两者不会同时被填充。
如果 Column_1 与中的等效值数不匹配 column_2 或者 column_3 然后我们必须填充null( Column_1 : I,J 以及 K,L )

Column_1 Column_2 Column_3
A,B,C,D  NULL     N1:N2:N3:N4
E,F      N5:N6    NULL
G        NULL     N7
H        NULL     NULL
I,J      NULL     N8
K,L      N9       NULL

我必须将分隔值转换成行,如下所示。

Column_1 Column_2
A        N1
B        N2
C        N3
D        N4
E        N5
F        N6
G        N7
H        NULL
I        N8
J        NULL
K        N9
L        NULL

有没有一种方法可以在javasparkapi中实现这一点,而不必使用udf。

z9zf31ra

z9zf31ra1#

scala解决方案。。。在java中应该是类似的。可以使用 coalesce ,用适当的分隔符拆分,使用 arrays_zip 转置,和 explode 将结果分成行。

df.select(
    explode(
        arrays_zip(
            split(col("Column_1"), ","), 
            coalesce(
                split(coalesce(col("Column_2"), col("Column_3")), ":"), 
                array()
            )
        )
    ).alias("result")
).select(
    "result.*"
).toDF(
    "Column_1", "Column_2"
).show

+--------+--------+
|Column_1|Column_2|
+--------+--------+
|       A|      N1|
|       B|      N2|
|       C|      N3|
|       D|      N4|
|       E|      N5|
|       F|      N6|
|       G|      N7|
|       H|    null|
|       I|      N8|
|       J|    null|
|       K|      N9|
|       L|    null|
+--------+--------+
6yt4nkrj

6yt4nkrj2#

还有一种方法,使用 transform 可以在元素上迭代的函数 column_1 并创建稍后分解的Map:

df.withColumn(
    "mappings",
    split(coalesce(col("Column_2"), col("Column_3")), ":")
).selectExpr(
    "explode(transform(split(Column_1, ','), (x, i) -> map(x, mappings[i]))) as mappings"
).selectExpr(
    "explode(mappings) as (Column_1, Column_2)"
).show()

//+--------+--------+
//|Column_1|Column_2|
//+--------+--------+
//|       A|      N1|
//|       B|      N2|
//|       C|      N3|
//|       D|      N4|
//|       E|      N5|
//|       F|      N6|
//|       G|      N7|
//|       H|    null|
//|       I|      N8|
//|       J|    null|
//|       K|      N9|
//|       L|    null|
//+--------+--------+

相关问题