如何按 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?的主要内容,如果未能解决你的问题,请参考以下文章
Spark SQL 查询:org.apache.spark.sql.AnalysisException
如何解决 Spark 中的“aggregateByKey 不是 org.apache.spark.sql.Dataset 的成员”?