Как создать выражение столбца из коллекции имен столбцов? - PullRequest
1 голос
/ 14 января 2020

У меня есть список строк, который представляет имена различных столбцов, которые я хочу добавить вместе, чтобы создать другой столбец:

val myCols = List("col1", "col2", "col3")

Я хочу преобразовать список в столбцы, а затем добавить столбцы вместе сделать последний столбец. Я искал несколько способов сделать это, и ближе всего я могу прийти к ответу:

df.withColumn("myNewCol", myCols.foldLeft(lit(0))(col(_) + col(_)))

Я получаю ошибку компиляции, когда он говорит, что ищет строку, когда все Я действительно хочу это столбец. Что не так? Как это исправить?

Ответы [ 2 ]

1 голос
/ 14 января 2020

Вот как вы можете динамически добавлять столбцы на основе имен столбцов в списке. Когда все столбцы имеют номера c, результатом является число. Первая переменная в foldLeft имеет тот же тип, что и return. foldLeft будет работать так же, как и уменьшить.

    val employees = //a dataframe with 2 numeric columns "salary","exp"
    val initCol = lit(0)
    val cols = Seq("salary","exp")

    val col1 = cols.foldLeft(initCol)((x,y) => x + col(y))

    employees.select(col1).show()
1 голос
/ 14 января 2020

Когда я попробовал это в spark-shell, это дало мне ошибку, которая точно говорит, что это за ошибка и где.

scala> myCols.foldLeft(lit(0))(col(_) + col(_))
<console>:26: error: type mismatch;
 found   : org.apache.spark.sql.Column
 required: String
       myCols.foldLeft(lit(0))(col(_) + col(_))
                                   ^

Просто подумайте о первой паре, которая дана функции foldLeft. Это будет lit(0) типа Column и col1 типа String. Там нет функции col, которая принимает Column.

Попробуйте уменьшить вместо:

myCols.map(col).reduce(_ + _)

Из официальной документации уменьшить :

Применяет двоичный оператор ко всем элементам этого набора, идущий справа налево.

результат вставки op между последовательными элементами этого набора, идущий вправо к слева:

op(x_1, op(x_2, ..., op(x_{n-1}, x_n)...))

где x1, ..., xn - элементы этой коллекции.

...