scala - 如何从 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 中执行此操作?
解决方案
首先,获取有实际值且不为空的列名。这可以通过以下功能完成:
val notNullColNames = Seq("A", "B", "C", "D").map(c => when(col(c).isNotNull, c))
通常使用创建一个值数组array
,但是,当输入为空时,这仍然会返回一个空值。相反,一种解决方案是使用concat_ws
并split
删除任何空值:
df.select($"id", split(concat_ws(",", notNullColNames:_*), ",").as("newColumn"))
对于示例输入,这将输出:
+---+------------+
| id| newColumn|
+---+------------+
| 1| [B, C]|
| 2|[A, B, C, D]|
| 3| [A]|
+---+------------+
推荐阅读
- angular - 如何使用量角器茉莉花处理角应用程序的不一致等待问题
- sql - 连接表上的 SQL 连接
- laravel - 添加 whereBetween 子句不会返回预期的结果集
- exception - Microsoft 信息保护异常:“指定了非活动标签”
- python - 导入 TFLearn 时出现 TensorFlow 警告
- r - 使用 rpy2 和 ggplot 在 jupyter 中显示绘图
- printing - 将 IFS 文件发送到 Outq 打印“@”符号行
- reporting-services - 如何为下拉菜单指定可用值
- python - Python 2 中的函数字典
- java - 我可以使用 pico 容器共享同一类的两个对象吗?