Spark中排序的幾種方式

2021-09-27 13:32:42 字數 3297 閱讀 6626

有如下的資料,我們需要對其進行排序,欄位的意思分別為:商品,**,數量

val rdd = sc.

parallelize

(list

("iphone5 1000 20"

,"iphone6 2000 50"

,"iphone7 2000 100"

,"iphone11 5000 50"

))

需求:把商品按照**公升序

import org.apache.spark.

//匯入的

import com.bigdata.spark.utils.implicitaspect._

def main

(args: array[string]

): unit =).

sortby

(x=>

(x._2)

)//排序規則

//列印資料

product.

printinfo()

sc.stop()

}}

結果如下:

上面printinfo方法,是對rdd進行了增強的方法,**如下:

object implicitaspect 

class

richrdd

[t](rdd: rdd[t])}

}

使用自定義類的時候注意下面三點:

繼承ordered類,重寫compare方法

序列化重寫tostring(可選,主要為了可以展示資料)

import com.bigdata.spark.utils.implicitaspect._

import org.apache.spark.

def main

(args: array[string]

): unit =).

sortby

(x =

> x)

//列印資訊

product.

printinfo()

sc.stop()

}}class

productinfov1

(val name: string, val price: double, val amount: int)

extends

ordered

[productinfov1] with serializable

//重寫tostring方法

override def tostring: string =

}

結果為:

推薦使用case class的原因,主要是因為

1.自動序列化

2.自動重寫了tostring

3.不需要new

import com.bigdata.spark.utils.implicitaspect._

import org.apache.spark.

def main

(args: array[string]

): unit =).

sortby

(x =

> x)

//列印資訊

product.

printinfo()

sc.stop()

}}case

class

productinfov2

(val name: string, val price: double, val amount: int)

extends

ordered

[productinfov2]

}

結果為:

存在下面這個類,不允許修改此類,對此類進行增強

case

class

productinfov2

(val name: string, val price: double, val amount: int)

可以通過隱式轉換對此類進行增強

def main

(args: array[string]

): unit =

} val product = rdd.

map(x =

>).

sortby

(x =

> x)

//列印資訊

product.

printinfo()

sc.stop()

}}結果:

需求:現在比方說要按照**公升序,如果**相同,按照數量降序

implicit on的公式如下:

implicit val ord = ordering[排序規則資料型別].on[資料的型別](x => 排序規則)

import com.bigdata.spark.utils.implicitaspect._

def main

(args: array[string]

): unit =

)/*** *

* x._2, -x._3排序規則

* (double, int)定義的是規矩的返回值型別

* (string, double, int) 資料的型別

*/implicit val ord = ordering[

(double, int)

].on[

(string, double, int)

](x =

>

(x._2,

-x._3)

) product.

sortby

(x =

> x)

.printinfo()

sc.stop()

}}

結果為:

Spark排序方式之Ordering on

一 spark的幾種排序方式 1 直接根據字段進行排序 弊端 如果欄位太多不便於使用 2 封裝乙個類,實現它的ordered 弊端 用自定義實現序列化方式比較麻煩 3 用case class的方式排序 推薦 不用new 預設就實現了序列化 4 最簡單的排序方式ordering on 二 spark最...

經典的幾種排序方式

所謂排序就是整理檔案中的記錄,使之按關鍵字遞增 或遞減 次序排列起來。穩定排序與不穩定排序 假設 ki kj 且排序前序列中 ri 領先於 rj 若在排序後的序列中 ri 仍領先於 rj 則稱排序方法是穩定的。若在排序後的序列中 rj 仍領先於 ri 則稱排序方法是不穩定的。例 序列 3 15 8 ...

Hive的幾種排序方式

記錄hive的幾種常見的排序方式 order by 普通排序,通過order對欄位進行降序或者公升序 select from emp order by sal sort by 對每乙個reduce的結果進行排序,為了看出效果,我們多設定幾個reduce,檢視每個reduce的結果是否是排序的。set...