spark从所有列值生成Column值

时间:2018-02-08 08:14:19

标签: scala apache-spark

我想在同一行的所有现有列值中添加一列。 例如,

col1 col2 ... coln      col_new
------------------      -------
True False ...False     "col1-..."
False True ...True      "col2-...-coln"

也就是说,当值为True时,然后使用“ - ”分隔符添加其列名,并保持相同直到最后一列。我们不知道我们会有多少列。

如何在Spark中使用withColumn()实现此目的? (斯卡拉)

1 个答案:

答案 0 :(得分:2)

如果都是BooleanTypes,那么您可以编写udf函数来获取新列,如下所示

import org.apache.spark.sql.functions._
val columnNames = df.columns

def concatColNames = udf((array: collection.mutable.WrappedArray[Boolean]) => array.zip(columnNames).filter(x => x._1 == true).map(_._2).mkString("-"))

df.withColumn("col_new", concatColNames(array(df.columns.map(col): _*))).show(false)

如果都是StringTypes,那么您只需修改udf功能,如下所示

def concatColNames = udf((array: collection.mutable.WrappedArray[String]) => array.zip(columnNames).filter(x => x._1 == "True").map(_._2).mkString("-"))

你应该得到你需要的东西