spark多欄位排序與取topN

2021-10-01 01:43:07 字數 1062 閱讀 3350

前面介紹了[k,v]結構的rdd排序方法,下面來看更為複雜的情況,如果有更為複雜的多字段排序需求該怎麼處理?

比如有如下資料

1 2

1 31 1

1 61 4

2 52 8

2 3

我們現在想先對第一列逆序排,如果第一列相同再按第二列逆序排,該怎麼辦呢?

以下兩種方式都可以滿足上面的需求

首先我們定義乙個secondsortkey

class secondsortkey(val first: int, val second: int) extends ordered[secondsortkey] with serializable  else 

}}

然後按如下方式即可實現:

val lines = sc.parallelize(array((1, 2), (1, 3), (1, 1), (1, 6), (1, 4), (2, 5), (2, 8), (2, 3)))

lines.map

.sortbykey(ascending = false)

.map(_._2)

.collect()

首先我們在方法中定義隱變數ordering:

implicit val ordering = new ordering[(int, int)]  else 

result

}}

然後按如下方式使用即可

val a = sc.parallelize(array((1, 2), (1, 3), (1, 1), (1, 6), (1, 4), (2, 5), (2, 8), (2, 3)))

a.map .sortbykey(ascending = false).map(_._2).collect()

還是上面的例子,比如我們要按第二列取top3

a.sortby(_._2, ascending = false).take(3)

linux sort 多欄位排序

linux多數發行版自帶的sort程式,非常強大,在此只說多字段排序 sort 有個引數 k,可以指定字段,有比較複雜的語法,不在文字範圍內。一下為一段資料 從基因中得到,僅僅作為demo 檔名為 data chr13 3008566 3008677 chr9 3024384 3024515 chr...

C vector多欄位排序

c 當中vector的資料型別是基本型別時,我們利用std sort很容易排序,當我們的型別是自定義的結構體,並且我們還要實現按多字段排序,我有兩種方法 1.我們通過過載operator方法來實現 本例子實現了struct中多個字段排序 cpp view plain copy include inc...

轉 多欄位排序

多欄位排序的問題其實很簡單,只要實現乙個自己的comparator就可以。例如我有乙個類 class student 然後我有乙個arraylist,新增了三個學生進去 public static void main string args 我的排序規則是,先按名字牌,如果名字一樣的,按照id來排,...