如何按 Seq[org.apache.spark.sql.Column] 降序排序 spark DataFrame?

Posted

技术标签:

【中文标题】如何按 Seq[org.apache.spark.sql.Column] 降序排序 spark DataFrame?【英文标题】:How to sort spark DataFrame by Seq[org.apache.spark.sql.Column] in descending order? 【发布时间】:2020-01-09 04:13:36 【问题描述】:

有如下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降序排列呢?

【问题讨论】:

您可以应用asc/desc 对各个列进行排序,例如val col = Seq(new Column("size").asc, new Column("color").desc) 【参考方案1】:

您可以使用col.map(_.desc) 构造带有desc ordering 的排序表达式:

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)

【讨论】:

以上是关于如何按 Seq[org.apache.spark.sql.Column] 降序排序 spark DataFrame?的主要内容,如果未能解决你的问题,请参考以下文章

Scala Spark用NULL替换空String

spark连接MongoDB

Spark SQL 查询:org.apache.spark.sql.AnalysisException

如何解决 Spark 中的“aggregateByKey 不是 org.apache.spark.sql.Dataset 的成员”?

Spark学习笔记——读写HDFS

Spark学习笔记——读写MySQL