考察spark自定義排序
package com.rz.spark.baseimport 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.baseimport 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.baseimport 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.baseimport 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.baseimport 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.baseimport 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特質的方式實...