因爲默認的distinct算子操作效率太低,自己改寫一下。
很簡單
def mydistinct(iter: Iterator[(String, Int)]): Iterator[String] = {
iter.foldLeft(Set[String]())((CurS, item) => CurS + item._1).toIterator
}
// mydistinct 的使用過程如下
val rdd2 = rdd1.
map(x => (x._1 + SPLIT + x._2 + SPLIT + x._3 + SPLIT + x._4, 1)).
partitionBy(new org.apache.spark.HashPartitioner(100)).
mapPartitions(SetProcess.mydistinct).
map(key => {
val strs = key.split(SPLIT)
(strs(0), strs(1), strs(2), strs(3))
})
說明:
- mydistinct的實現是利用set的特性實現的,在一個partition內實現,再reduce各個partition,從而實現全量去重。
- mydistinct實現之前,先做partitionBy,因爲key值發生變化,父rdd的分區不適用新的rdd,若不做partitionBy,分區與分區之間可能存在一樣的,最後reduce的時候還有可能出現重複。
- 做partitionBy就是爲了讓相同key值的數據,刷新到同一個分區內。再在partition內去重,大大提高的效率。