如何从Spark中的许多DataFrame列中转换为列表



我有此示例数据帧:

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?

在Spark中进行此操作

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

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新