天天看點

Spark DataFrame按某列降序排序

版權聲明:本文由董可倫首發于https://dongkelun.com,非商業轉載請注明作者及原創出處。商業轉載請聯系作者本人。 https://blog.csdn.net/dkl12/article/details/80961981

我的原創位址:

https://dongkelun.com/2018/07/04/sparkDfSortDesc/

前言

本文總結如何将DataFrame按某列降序排序,因為Spark預設的排序方式為升序,而降序的用法和java語言等又不一樣,是以需要特地總結記錄一下其用法。

1、建立測試用DataFrame

val data = Array((7, 2, 3), (1, 8, 6), (4, 5, 9))
val df = spark.createDataFrame(data).toDF("col1", "col2", "col3")
df.show()           
+----+----+----+
|col1|col2|col3|
+----+----+----+
|   7|   2|   3|
|   1|   8|   6|
|   4|   5|   9|
+----+----+----+           

2、預設的升序排序效果(按col2排序,以下都是)

df.orderBy("col2").show()           
+----+----+----+
|col1|col2|col3|
+----+----+----+
|   7|   2|   3|
|   4|   5|   9|
|   1|   8|   6|
+----+----+----+           

3、降序方法一

df.orderBy(-df("col2")).show           
+----+----+----+
|col1|col2|col3|
+----+----+----+
|   1|   8|   6|
|   4|   5|   9|
|   7|   2|   3|
+----+----+----+           

這個方法在前面加上負号-即可,看起來挺簡單的,但是其實這種方法不能在第一次建構df的時候進行排序,必須先建立好一個df,再用建立好的df生成新的df。

4、降序方法二

下面的方法和方法一是一樣的

df.orderBy(df("col2").desc).show           
+----+----+----+
|col1|col2|col3|
+----+----+----+
|   1|   8|   6|
|   4|   5|   9|
|   7|   2|   3|
+----+----+----+           

5、降序方法三

import org.apache.spark.sql.functions._
df.orderBy(desc("col2")).show           
+----+----+----+
|col1|col2|col3|
+----+----+----+
|   1|   8|   6|
|   4|   5|   9|
|   7|   2|   3|
+----+----+----+           

這種方法是我比較喜歡的,因為在第一次建立的時候就可以排序了,且使用起來也很簡潔。

可以使用下面的代碼測試一下

spark.createDataFrame(data).toDF("col1", "col2", "col3").orderBy(desc("col2")).show           
  • 注:上面導入的包,在spark-shell裡執行的時候是不需要的

6、降序方法四

下面的方法和方法三是一樣的,由于結果一樣,就不貼上了

df.orderBy(-col("col2")).show
           

7、降序方法五

下面的方法和方法四是一樣的,由于結果一樣,就不貼上了

df.orderBy(col("col2").desc).show           

8、sort函數

sort函數和orderBy用法和結果是一樣的,因為orderBy和sql文法裡的order by名字一樣,是以我首先想到這個方法,就把orderBy放在前面介紹了(sort比orderBy短一點哈~)

df.sort(desc("col2")).show           

附錄

package com.dkl.leanring.spark.df

import org.apache.spark.sql.SparkSession

object DfSortDesc {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder().appName("DfSortDesc").master("local").getOrCreate()

    val data = Array((7, 2, 3), (1, 8, 6), (4, 5, 9))
    val df = spark.createDataFrame(data).toDF("col1", "col2", "col3")
    //列印 df
    df.show()
    // 預設的升序
    df.orderBy("col2").show()
    //降序方法一
    df.orderBy(-df("col2")).show
    //降序方法二同上
    df.orderBy(df("col2").desc).show

    import org.apache.spark.sql.functions._
    //降序方法三
    df.orderBy(desc("col2")).show
    //測試方法三
    spark.createDataFrame(data).toDF("col1", "col2", "col3").orderBy(desc("col2")).show

    //降序方法四
    df.orderBy(-col("col2")).show
    //降序方法五
    df.orderBy(col("col2").desc).show
    //sort函數和orderBy用法和結果是一樣的
    df.sort(desc("col2")).show
    spark.stop()

  }

}           

參考資料

Spark-SQL之DataFrame操作大全 在Apache Spark 2.0中使用DataFrames和SQL