【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内去重,大大提高的效率。
发布了300 篇原创文章 · 获赞 143 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/BeiisBei/article/details/104175708
今日推荐