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内去重,大大提高的效率。
 
  

你可能感兴趣的:(Spark)