我想在同一行的所有现有列值中添加一列。 例如,
col1 col2 ... coln col_new
------------------ -------
True False ...False "col1-..."
False True ...True "col2-...-coln"
也就是说,当值为True时,然后使用“ - ”分隔符添加其列名,并保持相同直到最后一列。我们不知道我们会有多少列。
如何在Spark中使用withColumn()
实现此目的? (斯卡拉)
答案 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("-"))
你应该得到你需要的东西