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