首页 > 解决方案 > 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

是否有可能在数据框中实现这一点?

标签: apache-sparkapache-spark-sql

解决方案


如果您使用的是spark 3+,则可以使用filtertransform功能作为

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

推荐阅读