如何将列表的元素传递给concat函数?

时间:2019-01-23 06:32:07

标签: scala list apache-spark dataframe concatenation

我目前正在使用以下方法来合并数据框中的列:

val Finalraw = raw.withColumn("primarykey", concat($"prod_id",$"frequency",$"fee_type_code"))

但是问题是我不想对列进行硬编码,因为列数每次都在变化。我有一个包含列名称的列表:

columnNames: List[String] = List("prod_id", "frequency", "fee_type_code")

因此,问题是如何将列表元素传递给concat函数,而不是对列名进行硬编码?

2 个答案:

答案 0 :(得分:1)

当您有字符串列表时,concat函数将多列作为输入。您需要转换列表以适合方法输入。

首先,使用map将字符串转换为列对象,然后使用:_*解压缩列表以将参数正确传递给concat

val Finalraw = raw.withColumn("primarykey", concat(columnNames.map(col):_*))

有关:_*语法的说明,请参见What does `:_*` (colon underscore star) do in Scala?

答案 1 :(得分:1)

在单独的变量中将列表元素映射到List [org.apache.spark.sql.Column]。 检查一下。

scala> val df = Seq(("a","x-","y-","z")).toDF("id","prod_id","frequency","fee_type_code")
df: org.apache.spark.sql.DataFrame = [id: string, prod_id: string ... 2 more fields]

scala> df.show(false)
+---+-------+---------+-------------+
|id |prod_id|frequency|fee_type_code|
+---+-------+---------+-------------+
|a  |x-     |y-       |z            |
+---+-------+---------+-------------+


scala> val arr = List("prod_id", "frequency", "fee_type_code")
arr: List[String] = List(prod_id, frequency, fee_type_code)

scala> val arr_col = arr.map(col(_))
arr_col: List[org.apache.spark.sql.Column] = List(prod_id, frequency, fee_type_code)

scala> df.withColumn("primarykey",concat(arr_col:_*)).show(false)
+---+-------+---------+-------------+----------+
|id |prod_id|frequency|fee_type_code|primarykey|
+---+-------+---------+-------------+----------+
|a  |x-     |y-       |z            |x-y-z     |
+---+-------+---------+-------------+----------+


scala>