Spark distinct算子
Posted DataRain
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark distinct算子相关的知识,希望对你有一定的参考价值。
在某些业务逻辑里面会有去重的操作,有的去重操作是针对RDD中的value值的,有的去重操作是针对PairRDD中的key值的,这种两种情况下应该使用什么方式进行去重也需要去考量一下。Spark其中有提供一个distinct算子给我们进行去重操作的,那么这个算子是否真的符合实际业务逻辑那样给我们去重呢。
首先可以看看distinct算子的内部实现,如果是RDD类型的数据,这个算子会将其转为value值为null的PairRDD,然后使用reduceByKey算子对其进行去重(取其中的任意一条数据),去重完成后再返回这个PairRDD的key值构造成RDD。
/**
* Return a new RDD containing the distinct elements in this RDD.
*/
def distinct(numPartitions: Int)(implicit ord: Ordering[T] = null): RDD[T] = withScope {
map(x => (x, null)).reduceByKey((x, y) => x, numPartitions).map(_._1)
}
这种实现的话对RDD类型的数据来说确实可用,因为我们本来就是要筛选出唯一的value值。但是对于本来就是PairRDD类型的数据来说就很有问题了,这个算子会选出唯一的Tuple2<key,value>对象,而不是针对key选出唯一key对应的值,就像下面流程图所表现的:
以上是关于Spark distinct算子的主要内容,如果未能解决你的问题,请参考以下文章
Spark Distinct算子写入MySql TopN 性能分析