Список столбцов для orderBy в кадре данных spark - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть список переменных, который содержит имена столбцов. Я пытаюсь использовать это для вызова 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»? Спасибо,

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

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

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: _*)
0 голосов
/ 10 апреля 2020

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

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

Если вы заботитесь о заказе, используйте Column версию orderBy вместо

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