arrays - Spark scala 将列名称映射到值为 true 的输出 arraytype 列

标签 arrays string scala apache-spark

如何创建 ArrayType[StringType] 的列 colMap,其值为 Array,元素为与值为 true 的列名称匹配的字符串?

我有这样的输入DataFrame:

+-----+-----+-----+
|col1 |col2 |col3 |
+-----+-----+-----+
|true |false|true |
|false|false|false|
|false|false|true |
+-----+-----+-----+

我想创建这样的输出数据帧:

+-----+-----+-----+------------+
|col1 |col2 |col3 |colMap      |
+-----+-----+-----+------------+
|true |false|true |[col1, col3]|
|false|false|false|[]          |
|false|false|true |[col3]      |
+-----+-----+-----+------------+

编辑: 我发现了这个重复的问题:

Spark scala get an array of type string from multiple columns

但是想知道是否有更好的方法来实现输出?

最佳答案

您可以使用内置的高阶函数filter,而不是使用UDF从数组中过滤null值。 .

val df = Seq((true, false, true),
    (false, false, false),
    (false, false, true)).toDF("col1", "col2", "col3")


df.withColumn("colMap", array(df.columns.map(c=> when(col(c) === "true", c)):_*))
  .withColumn("colMap", expr("filter(colMap, c-> c is not null)"))
  .show(false)

+-----+-----+-----+------------+
|col1 |col2 |col3 |colMap      |
+-----+-----+-----+------------+
|true |false|true |[col1, col3]|
|false|false|false|[]          |
|false|false|true |[col3]      |
+-----+-----+-----+------------+

关于arrays - Spark scala 将列名称映射到值为 true 的输出 arraytype 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69190795/

相关文章:

scala - SBT Scaladoc 配置

scala - 如何在一种情况下对每个数字类进行模式匹配?

java - 退出数组 for 循环 Java

python - 如何交错 numpy.ndarrays?

c++ - 用 C++ 编写基于字符串的事件管理器

c++ - 隐式转换为 std::string

java - 如何从另一个 scala 文件扩展一个 scala 文件中定义的类

c - 如何在 C 中打印 "neat"二维数组

C++ 返回和插入二维数组对象

C: S_ISDIR 无法正常工作,只有 "."和 ".."显示为目录