Как отсортировать спарк DataFrame по Seq [org. apache .spark. sql .Column] в порядке убывания? - PullRequest
0 голосов
/ 09 января 2020

Существует DataFrame следующим образом:

import spark.implicits._
val df = List(
  ("id1","blue","1")
  ,("id2","red","2")
  ,("id3","red","3")
  ,("id4","blue","3")
  ,("id4","green","3")
).toDF("id", "color", "size")

+---+-----+----+
| id|color|size|
+---+-----+----+
|id1| blue|   1|
|id2|  red|   2|
|id3|  red|   3|
|id4| blue|   3|
|id4|green|   3|
+---+-----+----+

Существует Seq [org. apache .spark. sql .Column], и он может сортировать df следующим образом:

import org.apache.spark.sql.Column
val col = Seq(new Column("size"), new Column("color"))
df.sort(col:_*).show

Но я хочу отсортировать по col в порядке убывания.

import org.apache.spark.sql.functions.desc

df.sort(desc(col:_*)) не работает.

Тогда как отсортировать df по col в порядке убывания?

1 Ответ

3 голосов
/ 09 января 2020

Вы можете использовать col.map(_.desc) для построения выражений сортировки с desc упорядочением:

val col = Seq(new Column("size"), new Column("color"))

// ascending
df.sort(col: _*).show
+---+-----+----+
| id|color|size|
+---+-----+----+
|id1| blue|   1|
|id2|  red|   2|
|id4| blue|   3|
|id4|green|   3|
|id3|  red|   3|
+---+-----+----+

// descending
df.sort(col.map(_.desc): _*).show
+---+-----+----+
| id|color|size|
+---+-----+----+
|id3|  red|   3|
|id4|green|   3|
|id4| blue|   3|
|id2|  red|   2|
|id1| blue|   1|
+---+-----+----+

Здесь col.map(_.desc) возвращает список выражений:

col.map(_.desc)
// res2: Seq[org.apache.spark.sql.Column] = 
//       List(size DESC NULLS LAST, color DESC NULLS LAST)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...