apache-spark - Spark:如何在数据框中单独处理某些列内容?
问题描述
数据结构是这样的:
ID | 姓名 | 数据 |
---|---|---|
001 | 啊啊啊 | 真,假,假 |
002 | bbb | 真实,真实,真实 |
003 | ccc | 假,真,真 |
我想通过映射表中的相应顺序将数据中的结果映射到它们的名称。详细来说,第一步是获取数据中False的序号,然后通过映射表中的序号获取名称。
比如第一条记录有两个False,它们的索引号分别是2和3,那么映射结果就是code2和code3。此外,第二条记录中都为真,因此映射结果为空字符串。
映射表:("code1","code2","code3")
预期结果:
ID | 姓名 | 数据 |
---|---|---|
001 | 啊啊啊 | 代码2,代码3 |
002 | bbb | |
003 | ccc | 代码1 |
是否有可能在数据框中实现这一点?
解决方案
如果您使用的是spark 3+,则可以使用filter
和transform
功能作为
val df = Seq(
("001", "aaa", "true,false,false"),
("002", "bbb", "true,true,true"),
("003", "ccc", "false,true,true"),
).toDF("id", "name", "data")
val cols = Seq("col1", "col2", "col3")
val dfNew = df.withColumn("data", split($"data", ","))
.withColumn("mapping", arrays_zip($"data", typedLit(cols)))
.withColumn("new1", filter($"mapping", (c: Column) => c.getField("data") === "false"))
.withColumn("data", transform($"new1", (c: Column) => c.getField("1")))
.drop("new1", "mapping")
dfNew.show(false)
输出:
+---+----+------------+
|id |name|data |
+---+----+------------+
|001|aaa |[col2, col3]|
|002|bbb |[] |
|003|ccc |[col1] |
+---+----+------------+
推荐阅读
- linux - RHEL 6 上的 postgres 10.5 安装问题
- ios - Swift4,解析JSON后将空数据更改为“”(空字符串)
- typescript - Angular 5 更新视图
- visual-studio-code - 使用 vscode 作为 sos 的编辑器
- javascript - 如何在使用jQuery对选择标签进行休息调用后保留下拉列表的值
- html - 创建伪按钮的渐变问题
- sql-server - 如何在 cfoutput 中显示不同的值
- combobox - ms access 组合框不会自动填充
- asp.net - 如何从 vb.net 中 datalist 中的 datakey 字段中获取值
- ruby-on-rails - Ruby on Rails - 何时使用 params.permit!以及如何更换它