【Spark】Spark 優化操作之自定義 distinct

因爲默認的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))
  })

說明:

  1. mydistinct的實現是利用set的特性實現的,在一個partition內實現,再reduce各個partition,從而實現全量去重。
  2. mydistinct實現之前,先做partitionBy,因爲key值發生變化,父rdd的分區不適用新的rdd,若不做partitionBy,分區與分區之間可能存在一樣的,最後reduce的時候還有可能出現重複。
  3. partitionBy就是爲了讓相同key值的數據,刷新到同一個分區內。再在partition內去重,大大提高的效率。
發佈了286 篇原創文章 · 獲贊 139 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章