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