Spark 自定義排序

2022-05-17 19:32:21 字數 3298 閱讀 6514

考察spark自定義排序

package com.rz.spark.base

import org.apache.spark.rdd.rdd

import org.apache.spark.

//自定義排序

object

customsort1 )

//不滿足要求

> tp._3, false)

//將rdd裡面封裝在user型別的資料進行排序

val sorted: rdd[user] = userrdd.sortby(u=>u)

val result =sorted.collect()

println(result.tobuffer)

sc.stop()

}}//shuffle時資料要通過網路傳輸,需要對資料進行序列化

class

user(val name:string, val age:int, val fv:int) extends ordered[user] with serializable

else

} override def tostring: string = s"

name: $name, age: $age, fv: $fv

"}

package com.rz.spark.base

import org.apache.spark.

import org.apache.spark.rdd.rdd

object

customsort2 )

//排序(傳入了乙個排序規則, 不會改變資料的格式,只會以改變順序) class boy不是多例

val sorted: rdd[(string, int, int)] = userrdd.sortby(tp=> new

boy(tp._2,tp._3))

val result =sorted.collect()

println(result.tobuffer)

sc.stop()

}}//shuffle時資料要通過網路傳輸,需要對資料進行序列化

class

boy(val age:int, val fv:int) extends ordered[boy] with serializable

else

}}

方式3:作用多例的case class來做排序規則

package com.rz.spark.base

import org.apache.spark.

import org.apache.spark.rdd.rdd

object

customsort3 )

//排序(傳入了乙個排序規則, 不會改變資料的格式,只會以改變順序)

val sorted: rdd[(string, int, int)] = userrdd.sortby(tp=>man(tp._2,tp._3))

val result =sorted.collect()

println(result.tobuffer)

sc.stop()

}}//shuffle時資料要通過網路傳輸,需要對資料進行序列化

//case class 本身已經實現序列化且多例 (缺點是規則寫死,無法用新的規則排序,可用隱式轉換實現)

case

class

man(age:int, fv:int) extends ordered[man]

else

}}

方式4,通過隱式引數指定靈活的排序規則

package com.rz.spark.base

import org.apache.spark.

import org.apache.spark.rdd.rdd

object

customsort4 )

//排序(傳入了乙個排序規則, 不會改變資料的格式,只會以改變順序)

//傳入乙個ordering型別的隱式引數

import sortrules.orderinghero

val sorted: rdd[(string, int, int)] = userrdd.sortby(tp=>hero(tp._2,tp._3))

val result =sorted.collect()

println(result.tobuffer)

sc.stop()

}}//shuffle時資料要通過網路傳輸,需要對資料進行序列化

//case class 本身已經實現序列化,不指定固定的排序規則,由隱式引數指定

case

class hero(age:int, fv:int)

方式5:元組有自己的compareto方法,充分利用元組的比較規則,元組的比較規則:先比第一,相等再比第二個。如果還滿足不了再自定義排序的類來排序

package com.rz.spark.base

import org.apache.spark.

import org.apache.spark.rdd.rdd

object

customsort5 )

//排序(傳入了乙個排序規則, 不會改變資料的格式,只會以改變順序)

//充分利用元組的比較規則,元組的比較規則:先比第一,相等再比第二個

val sorted: rdd[(string, int, int)] = userrdd.sortby(tp=> (-tp._3,tp._2))

val result =sorted.collect()

println(result.tobuffer)

sc.stop()

}}

方式6:和方式5相似,但是用到自定義的隱式引數作排序規則

package com.rz.spark.base

import org.apache.spark.rdd.rdd

import org.apache.spark.

object

customsort6 )

//排序(傳入了乙個排序規則, 不會改變資料的格式,只會以改變順序)

//充分利用元組的比較規則,元組的比較規則:先比第一,相等再比第二個

val sorted: rdd[(string, int, int)] = userrdd.sortby(tp=> (-tp._3,tp._2))

val result =sorted.collect()

println(result.tobuffer)

sc.stop()

}}

Spark自定義排序

在這之前,我們先準備一些資料,使用rdd存放 獲得sparkcontext val conf sparkconf newsparkconf setmaster local 2 val sc newsparkcontext conf val rdd sc.parallelize list 公尺家雷射投...

Spark自定義排序

spark支援我們自定義,只需要繼承相應的類就可以了,我在下面準備了乙個用身高和年齡做二次排序的例子,希望可以幫到大家 首先寫乙個排序類 名字 年齡 身高 class people val name string val age int,val hight int extends ordered p...

spark兩種自定義排序方式

一 目標物件新增隱式轉換函式的方式實現自定義排序 object mysortelse 隱式轉換函式實現自定義排序 object customsort1 學生類 case class student name string,age int,score int 二 目標物件實現ordered特質的方式實...