最近,有位朋友问我,distinct去重原理是怎么实现的?

“在面试时,面试官问他了解distinct算子吗?”

“了解啊,Spark的rdd,一种transFormation去重的算子,主要用来去重的”。

“哟,看来你经常使用distinct算子,对distinct算子很熟悉啊”。

“好说,好说”。

“那你能说说distinct是如何实现去重的吗?”

我朋友支支吾吾半天:“就是这样、那样去重的啊”。

“这样、那样是怎么去重的呢”

“具体有点忘记了(其实是根本就不知道)”。

那么distinct,底层到底是如何实现去重功能的呢?这个是面试spark部分时,经常被问到的问题。

先来看一段代码,我们测试一下distinct去重的作用:

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}object SparkDistinct {def main(args: Array[String]): Unit = {val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("SparkDistinct")val sc: SparkContext = new SparkContext(conf)//定义一个数组val array: Array[Int] = Array(1,1,1,2,2,3,3,4)//把数组转为RDD算子,后面的数字2代表分区,也可以指定3,4....个分区,也可以不指定。val line: RDD[Int] = sc.parallelize(array,2)line.distinct().foreach(x => println(x))//输出的结果已经去重:1,2,3,4}
}

通过上面的代码可以看出,使用distinct以后,会对重复的元素进行去重。我们来看下源码

/*** 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)}/*** Return a new RDD containing the distinct elements in this RDD.*/def distinct(): RDD[T] = withScope {distinct(partitions.length)}

上面是distinct的源码,有带参和无参两种。当我们调用无参的distinct时,底层调用的是如下源码:

def distinct(): RDD[T] = withScope {distinct(partitions.length)}

而无参distinct()中又调用了带参数的distinct(partitions.length)。

其中,partitions.length代表是分区数,而这个分区则是我们在使用 sc.parallelize(array,2) 时指定的2个分区。

带参数的distinct其内部就很容易理解了,这就是一个wordcount统计单词的方法,区别是:后者通过元组获取了第一个单词元素。

map(x => (x, null)).reduceByKey((x, y) => x, numPartitions).map(_._1)

其中,numPartitions就是分区数。

我们也可以写成这样:

map(x => (x, null)).reduceByKey((x, y) => x).map(_._1)

也可以这样写:

line.map(x =>(x,1)).reduceByKey(_+_).map(_._1)

通过上面的流程图很清晰的看出来,distinct的原理流程。

使用map算子把元素转为一个带有null的元组;使用reducebykey对具有相同key的元素进行统计;之后再使用map算子,取得元组中的单词元素,实现去重的效果。

大数据Spark面试,distinct去重原理,是如何实现的相关推荐

  1. Python+大数据-Spark技术栈(二)SparkBaseCore

    Python+大数据-Spark技术栈(二)SparkBase&Core 学习目标 掌握SparkOnYarn搭建 掌握RDD的基础创建及相关算子操作 了解PySpark的架构及角色 环境搭建 ...

  2. 2021年大数据工程师面试内容包括哪些?

    2021年大数据工程师面试内容包括哪些? [导语]近年来,大数据发展如火如荼,很多人都选择学习大数据专业或者转行大数据,大数据里又包含很多就业岗位,所以在进行岗位选择的时候,还是需要大家合理选择,为了 ...

  3. 推荐大数据Spark必读书目

    点击蓝色"有关SQL"关注我哟 加个"星标",天天与10000人一起快乐成长 我有一个非常要好的同事,无数次帮我解决了业务上的痛.技术能力很强,业务方面也精通. ...

  4. 2016年大数据Spark“蘑菇云”行动代码学习之AdClickedStreamingStats模块分析

    2016年大数据Spark"蘑菇云"行动代码学习之AdClickedStreamingStats模块分析     系统背景:用户使用终端设备(IPAD.手机.浏览器)等登录系统,系 ...

  5. 光环大数据spark文档_推荐大数据Spark必读书目

    我有一个非常要好的同事,无数次帮我解决了业务上的痛.技术能力很强,业务方面也精通.而且更耐得住加班,并且是自愿加班,毫无怨言.不像我,6点到准时走人了.但就是这么一位兢兢业业的技术人,却一直没有升职加 ...

  6. 大数据分析师面试求职攻略

    面试大数据分析前焦虑怎么办? 如果你没有得到面试怎么办? 大数据分析师面试过程尴尬怎么办? 如何准备大数据分析师面试? 大数据分析师的面试技巧有哪些? 大数据分析师的面试注意事项有哪些? 如何在大数据 ...

  7. 大数据学长面试之瓜子二手车面试题

    大数据学长面试之瓜子二手车面试题 1)技术部分 (1)优化必问 hive/spark (2)为什么kafka可以实现高吞吐?单节点kafka的吞吐量也比其他消息队列大,为什么? (3)如果写了JVM调 ...

  8. 大数据Spark超经典视频链接全集

    论坛贴吧等信息发布参考模板 Scala.Spark史上最全面.最详细.最彻底的一整套视频全集(特别是机器学习.Spark Core解密.Spark性能优化.Spark面试宝典.Spark项目案例等). ...

  9. 大数据Spark实战视频教程-张长志-专题视频课程

    大数据Spark实战视频教程-33364人已学习 课程介绍         大数据Spark实战视频培训教程:本课程内容涉及,Spark虚拟机安装.Spark表配置.平台搭建.快学Scala入门.Sp ...

最新文章

  1. 如何优雅的在python中暂停死循环?
  2. 区块链技术未来可能用于哪些方面?
  3. 137% YOLOv3加速、10倍搜索性能提升!百度飞桨推出模型压缩神器
  4. linux xargs与管道的区别
  5. 《EMCAScript6入门》读书笔记——24.编程风格
  6. java可比较的和比较器的区别_Java中Compareable和Comparator两种比较器的区别
  7. linux 文件的压缩和打包
  8. C++打印浮点数时保留两位小数
  9. linux环境OpenRASP使用教程,集成openRASP与攻击测试
  10. 字扩展、位扩展、字位同时扩展
  11. c java互通rsa_C# RSA和Java RSA互通
  12. 汇编语言-学习笔记(一)
  13. 怎样把网站js文件合并成一个?几种方法可以实现
  14. 化解字符串不能超过8000的方法及交叉表的处理
  15. 【流水账】对Pupper的软件设备进行配置(树莓派)
  16. 计算机还原取消,如何取消开机一键还原F11选项?
  17. 大数据服务节点配置参考
  18. Markdown懒办法排版微信公众号文章
  19. MODBUS RTU 协议读卡器
  20. 2021届毕业生还没找到Android开发工作,看这一篇就够了!

热门文章

  1. 自动登录百度推广后台
  2. 微信朋友如何互动起来
  3. h3cne相当于华为的的那个级别?H3C和华为认证选择哪一个认证比较好呢?现在工作中用到那个厂家的设备多?
  4. C语言:水仙花数(daffodil),求出三位数中所有水仙花数
  5. 【Oracle】Oracle数据库忘记用户名和密码怎么办?重置密码方法
  6. 关于SQL server导入.mdf文件显示附加数据库时出错。有关详细信息,请单击“消息”列中的超链接
  7. 小米开源框架mace android案例调试
  8. 2022-2027年中国医院集团化市场规模现状及投资规划建议报告
  9. jsp导出excel,可传动态参数
  10. 立完flag,你可能需要对flag进行量化