我编写了以下函数,该函数将两个字符串连接起来并将它们添加到dataframe的新列中:
def idCol(firstCol: String, secondCol: String, IdCol: String = FUNCTIONAL_ID): DataFrame = {
df.withColumn(IdCol,concat(col(firstCol),lit("."),col(secondCol))).dropDuplicates(IdCol)
}
我的目标是用一个字符串数组代替对不同字符串的使用,然后根据数组中这些不同元素的串联定义新列。我使用数组的目的是为了获得可变的数据收集,以防要连接的元素数量发生变化。 你有关于如何做到这一点的想法吗 因此该功能将更改为:
def idCol(cols:Array[String], IdCol: String = FUNCTIONAL_ID): DataFrame = {
df.withColumn(IdCol,concat(col(cols(0)),lit("."),col(cols(1))).dropDuplicates(IdCol)
}
我想绕过cols(0),cols(1)并进行通用转换,该转换将array的所有元素都用char“。”隔开。
答案 0 :(得分:1)
您可以使用concat_ws
,其定义如下:
def concat_ws(sep: String, exprs: Column*): Column
您需要将String
中的列名转换为Column
类型:
import org.apache.spark.sql.functions._
def idCol(cols:Array[String], IdCol: String = FUNCTIONAL_ID): DataFrame = {
val concatCols = cols.map(col(_))
df.withColumn(IdCol, concat_ws(".", concatCols : _*) ).dropDuplicates(IdCol)
}