Список столбцов для orderBy в искровом фрейме данных

У меня есть список переменных, который содержит имена столбцов. Я пытаюсь использовать это для вызова orderBy в кадре данных.

val l = List("COL1", "COL2")
df.orderBy(l.mkString(","))

Но mkstring объединяет имена столбцов в одну строку, что приводит к этой ошибке:

org.apache.spark.sql.AnalysisException: cannot resolve '`COL1,COL2`' given input columns: [COL1, COL2, COL3, COL4];

Как я могу преобразовать этот список строк в разные строки, чтобы он искал «COL1», «COL2» вместо «COL1, COL2»? Спасибо,


person NITS    schedule 10.04.2020    source источник


Ответы (2)


Передача одного аргумента String указывает Spark сортировать фрейм данных, используя один столбец с заданным именем. Существует метод, который принимает несколько имен столбцов, и вы можете использовать его таким образом:

val l = List("COL1", "COL2")
df.orderBy(l.head, l.tail: _*)

Если вам небезразличен порядок, используйте вместо него Column версию orderBy.

val l = List($"COL1", $"COL2".desc)
df.orderBy(l: _*)
person moped    schedule 10.04.2020
comment
Спасибо. Это то, что я хотел. Есть ли способ указать desc здесь? - person NITS; 10.04.2020

Вы можете вызвать orderBy для определенного столбца:

import org.apache.spark.sql.functions._
df.orderBy(asc("COL1")) // df.orderBy(asc(l.headOption.getOrElse("COL1")))
// OR
df.orderBy(desc("COL1"))

Если вы хотите отсортировать по нескольким столбцам, вы можете написать что-то вроде этого:

val l = List($"COL1", $"COL2".desc)
df.sort(l: _*)
person Bob    schedule 10.04.2020
comment
Спасибо, Боб, начал с головы и хвоста и в конце концов пришел к тому, что у вас есть в конце... - person NITS; 11.04.2020
comment
@NITS Хорошо! Рад, если вы довольны - person Bob; 11.04.2020