【问题标题】:Multiple comma delimited values to separate row in Spark Java多个逗号分隔值在 Spark Java 中分隔行
【发布时间】:2021-05-14 22:26:58
【问题描述】:

我有以下数据集。 Column_1 用逗号分隔,Column_2Column_3 用冒号分隔。都是字符串列。 来自Column_1 的每个逗号分隔值都应该是Column_1 中的单独一行,并且应该填充来自Column_2Column_3 的等效值。将填充 column_2column_3,但不会同时填充两者。

如果Column_1 中的值的数量与column_2column_3 中的等效值的数量不匹配,那么我们必须填充null(Column_1I,JK,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

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

【问题讨论】:

    标签: java dataframe apache-spark apache-spark-sql


    【解决方案1】:

    Scala 解决方案...在 Java 中应该类似。您可以使用 coalesce 组合第 2 列和第 3 列,使用适当的分隔符将它们拆分,使用 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|
    +--------+--------+
    

    【讨论】:

      【解决方案2】:

      这是另一种方式,使用transform 函数,您可以遍历column_1 的元素并创建稍后分解的地图:

      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|
      //+--------+--------+
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-04
        • 2012-04-11
        • 2016-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多