在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"}
换句话说,我想制作一个新的列,其中包含包含行值不为null的列名的列表。
我该如何使用Scala?
首先,获取具有实际值而不是空的列名。这可以通过以下功能来完成:
val notNullColNames = Seq("A", "B", "C", "D").map(c => when(col(c).isNotNull, c))
创建通常使用 array
的值数组,但是,当输入为null时,这仍然会给零。相反,一种解决方案是使用concat_ws
和split
删除任何空值:
df.select($"id", split(concat_ws(",", notNullColNames:_*), ",").as("newColumn"))
对于示例输入,这将输出:
+---+------------+
| id| newColumn|
+---+------------+
| 1| [B, C]|
| 2|[A, B, C, D]|
| 3| [A]|
+---+------------+