Как передать элементы списка в функцию concat? - PullRequest
0 голосов
/ 23 января 2019

В настоящее время я использую следующий подход для объединения столбцов в кадре данных:

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 голосов
/ 23 января 2019

Сопоставить элементы списка с 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>
0 голосов
/ 23 января 2019

Функция concat принимает несколько столбцов в качестве входных данных, пока у вас есть список строк. Вам нужно преобразовать список, чтобы он соответствовал методу ввода.

Сначала используйте map для преобразования строк в объекты столбца, а затем распакуйте список с помощью :_*, чтобы правильно передать аргументы concat.

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

Объяснение синтаксиса :_* см. Что делает `: _ *` (знак подчеркивания двоеточия) в Scala?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...