【问题标题】:How to convert to list from many columns of dataframe in Spark?如何从 Spark 中的多列数据框转换为列表?
【发布时间】:2019-04-03 15:41:20
【问题描述】:

我有这个示例数据框:

id |  A  |  B  |  C  |  D 
1  |NULL | 1   | 1   |NULL
2  | 1   | 1   | 1   | 1
3  | 1   |NULL |NULL |NULL

我想改成这种格式:

id | newColumn
1  | {"B", "C"}
2  | {"A","B","C","D"}
3  | {"A"}

换句话说,我想用一个列表创建一个新列,其中包含行值不为空的列名。

如何在 Spark 中使用 Scala 做到这一点?

【问题讨论】:

    标签: scala list apache-spark null apache-spark-sql


    【解决方案1】:

    首先,获取有实际值且不为空的列名。这可以通过如下函数来完成:

    val notNullColNames = Seq("A", "B", "C", "D").map(c => when(col(c).isNotNull, c))
    

    通常使用array 创建一个值数组,但是,当输入为空时,这仍会返回空值。相反,一种解决方案是使用concat_wssplit 删除任何空值:

    df.select($"id", split(concat_ws(",", notNullColNames:_*), ",").as("newColumn"))
    

    对于示例输入,这将输出:

    +---+------------+
    | id|   newColumn|
    +---+------------+
    |  1|      [B, C]|
    |  2|[A, B, C, D]|
    |  3|         [A]|
    +---+------------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-17
      • 2017-06-11
      • 1970-01-01
      • 2018-03-29
      • 2019-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多