我目前正在使用以下方法来合并数据框中的列:
val Finalraw = raw.withColumn("primarykey", concat($"prod_id",$"frequency",$"fee_type_code"))
但是问题是我不想对列进行硬编码,因为列数每次都在变化。我有一个包含列名称的列表:
columnNames: List[String] = List("prod_id", "frequency", "fee_type_code")
因此,问题是如何将列表元素传递给concat
函数,而不是对列名进行硬编码?
答案 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>