【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内去重,大大提高的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值