【大数据学习 | Spark-Core】关于distinct算子

只有shuffle类的算子能够修改分区数量,这些算子不仅仅存在自己的功能,比如分组算子groupBy,它的功能是分组但是却可以修改分区。

而这里我们要讲的distinct算子也是一个shuffle类的算子。即可以修改分区。

Scala 复制代码
scala> val arr = Array(1,1,2,2,3,3,4,4,5,5,6,6)
arr: Array[Int] = Array(1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6)

scala> val rdd = sc.makeRDD(arr)
rdd: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[19] at makeRDD at <console>:26

scala> rdd.distinct
res29: org.apache.spark.rdd.RDD[Int] = MapPartitionsRDD[22] at distinct at <console>:26

scala> res29.collect
res30: Array[Int] = Array(1, 2, 3, 4, 5, 6)   

去重使用方式很简单。

但是原理却不简单。

思考一下怎么进行数据去重的?

这个同sql和mr是一样,都是分组完毕取出key的值。(即先groupBy,再map)

Scala 复制代码
scala> arr
res31: Array[Int] = Array(1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6)

scala> sc.makeRDD(arr)
res32: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[23] at makeRDD at <console>:27

scala> res32.groupBy(t=> t)
res33: org.apache.spark.rdd.RDD[(Int, Iterable[Int])] = ShuffledRDD[25] at groupBy at <console>:26

scala> res33.map(_._1).collect
res34: Array[Int] = Array(1, 2, 3, 4, 5, 6)

distinct的底层实现是通过分组实现,分组存在shuffle,所以可以修改分区数量,所以切分阶段

能够修改分区数量的算子必须存在shuffle。但是如果人为不去设定分区数量,下游的分区数量和上游相同。

可以修改分区数量

Scala 复制代码
scala> arr
res35: Array[Int] = Array(1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6)

scala> sc.makeRDD(arr,3)
res36: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[27] at makeRDD at <console>:27

scala> res36.distinct(6)
res37: org.apache.spark.rdd.RDD[Int] = MapPartitionsRDD[30] at distinct at <console>:26

scala> res37.partitions.size
res38: Int = 6

scala> res36.distinct(2)
res39: org.apache.spark.rdd.RDD[Int] = MapPartitionsRDD[33] at distinct at <console>:26

scala> res39.partitions.size
res40: Int = 2

distinct 可以增加也可以减少分区数量

相关推荐
DeepSCRM1 分钟前
从“断开实体假说”谈起:重构跨域多平台SCRM体系的技术逻辑与实战方案
大数据·重构
财经资讯数据_灵砚智能14 分钟前
基于全球经济类多源新闻的NLP情感分析与数据可视化(日间)2026年4月23日
大数据·人工智能·python·信息可视化·自然语言处理
yuanmazhiwu15 分钟前
计算机毕业设计:Python股市行情可视化与ARIMA预测系统 Flask框架 ARIMA 数据分析 可视化 大数据 大模型(建议收藏)✅
大数据·python·数据分析·django·flask·课程设计
Never_every9923 分钟前
8 个高清 4K 视频素材网址!无水印可商用
大数据·前端·音视频·视频
前端若水36 分钟前
Git 撤销与恢复完全指南(超级详细版)
大数据·git·elasticsearch
VBsemi-专注于MOSFET研发定制39 分钟前
共享汽车功率管理器件选型实战:空间、效率与可靠性的平衡之道
大数据·汽车
tonydf1 小时前
一次由组件并发引发的类“缓存击穿”问题排查与修复
redis·后端·架构
前端若水1 小时前
Git 可以做的所有操作(完整分类)
大数据·git·elasticsearch
财经资讯数据_灵砚智能1 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(夜间-次晨)2026年4月22日
大数据·人工智能·python·信息可视化·自然语言处理
武子康1 小时前
大数据-276 Spark MLib-深入理解Bagging与Boosting:集成学习核心算法对比与GBDT实战
大数据·后端·spark