首页 > 解决方案 > 如何从 Spark 中的多列数据框转换为列表?

问题描述

我有这个示例数据框:

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"}

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

如何使用 Scala 在 Spark 中执行此操作?

标签: scalalistapache-sparknullapache-spark-sql

解决方案


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

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

推荐阅读