1. 代码实例:

a.

val rdd = sc.makeRDD(Seq("aa", "bb", "cc", "aa", "cc"), 1)
//对RDD中的元素进行去重操作
rdd.distinct(1).collect().foreach(println)
rs:
aa
bb
cc

b.

val rdd: RDD[(String, Int)] = sc.makeRDD(Seq(("aa", 1), ("bb", 1), ("cc", 1), ("aa", 1), ("cc", 1)), 1)
//pair RDD,即RDD的每一行是(key, value),key相同进行聚合
rdd.groupByKey().map(v => (v._1, v._2.sum)).collect().foreach(println)
rs:
(aa,2)
(bb,1)
(cc,2)

c.

val rdd: RDD[(String, Int)] = sc.makeRDD(Seq(("aa", 1), ("bb", 1), ("cc", 1), ("aa", 1), ("cc", 1)), 1)
//pair RDD,即RDD的每一行是(key, value),key相同进行聚合
rdd.reduceByKey(_+_).collect().foreach(println)
rs:
(aa,2)
(bb,1)
(cc,2)

2. groupByKey和reduceByKey的区别

reduceByKey对每个key对应的多个value进行merge操作,最重要的是它能够在本地进行merge操作,并且merge操作可以通过函数自定义。groupBykey也是对每个key进行操作,但是只生成一个sequence。因为groupByKey不能自定义函数,我们需要先用groupByKey生成RDD,然后才能对此RDD通过map进行自定义函数操作。当调用groupByKey时,所有的键值对(key-value pair)都会被移动。在网络上传输数据非常没必要,避免使用groupByKey。

区别: reduceByKey,在本机suffle后,再发送一个总map,发送到一个总机器上suffle汇总map,(汇总要压力小)
groupByKey,发送本机所有的map,在一个机器上suffle汇总map(汇总压力大)
因此,在对大数据进行复杂计算时,reduceByKey优于groupByKey。 另外,如果仅仅是group处理,那么以下函数应该优先于
groupByKey :   
1)、combineByKey 组合数据,但是组合之后的数据类型与输入时值的类型不一样。
2)、foldByKey合并每一个 key 的所有值,在级联函数和“零值”中使用。

3. 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)
}

可见,distinct也是调用reduceByKey,不用groupByKey

4.看看groupByKey源码

/*** Group the values for each key in the RDD into a single sequence. Allows controlling the* partitioning of the resulting key-value pair RDD by passing a Partitioner.* The ordering of elements within each group is not guaranteed, and may even differ* each time the resulting RDD is evaluated.** @note This operation may be very expensive. If you are grouping in order to perform an* aggregation (such as a sum or average) over each key, using `PairRDDFunctions.aggregateByKey`* or `PairRDDFunctions.reduceByKey` will provide much better performance.** @note As currently implemented, groupByKey must be able to hold all the key-value pairs for any* key in memory. If a key has too many values, it can result in an [[OutOfMemoryError]].*/
def groupByKey(partitioner: Partitioner): RDD[(K, Iterable[V])] = self.withScope {// groupByKey shouldn't use map side combine because map side combine does not// reduce the amount of data shuffled and requires all map side data be inserted// into a hash table, leading to more objects in the old gen.val createCombiner = (v: V) => CompactBuffer(v)val mergeValue = (buf: CompactBuffer[V], v: V) => buf += vval mergeCombiners = (c1: CompactBuffer[V], c2: CompactBuffer[V]) => c1 ++= c2val bufs = combineByKeyWithClassTag[CompactBuffer[V]](createCombiner, mergeValue, mergeCombiners, partitioner, mapSideCombine = false)bufs.asInstanceOf[RDD[(K, Iterable[V])]]
}

内部调用了 combineByKeyWithClassTag,而且连源码都说了:This operation may be very expensive

Spark中distinct、reduceByKey和groupByKey的区别与取舍相关推荐

  1. Spark中 RDD之coalesce与repartition区别

    Spark中 RDD之coalesce与repartition区别 coalesce def coalesce(numPartitions: Int, shuffle: Boolean = false ...

  2. spark RDD,reduceByKey vs groupByKey

    Spark中有两个类似的api,分别是reduceByKey和groupByKey.这两个的功能类似,但底层实现却有些不同,那么为什么要这样设计呢?我们来从源码的角度分析一下. 先看两者的调用顺序(都 ...

  3. Spark中cache、persist、checkpoint区别

    spark中的cache.persist.checkpoint都可以将RDD保存起来,进行持久化操作,供后面重用或者容错处理.但是三者有所不同. cache 将数据临时存储在内存中进行数据重用,不够安 ...

  4. oracle中distinct和group by的区别

    其实二者没有什么可比性,但是对于不包含聚集函数的GROUP BY操作来说,和DISTINCT操作是等价的.不过虽然二者的结果是一样的,但是二者的执行计划并不相同. 在Oracle9i中: SQL> ...

  5. Spark中foreachPartition和mapPartitions的区别

    Spark中foreachPartition和mapPartitions的区别 spark的运算操作有两种类型:分别是Transformation和Action,区别如下: Transformatio ...

  6. Spark:reduceByKey与groupByKey进行对比

    两者不同之处: 返回值类型不同:reduceByKey返回的是RDD[(K, V)],而groupByKey返回的是RDD[(K, Iterable[V])],举例来说这两者的区别.比如含有一下数据的 ...

  7. reduceByKey和groupByKey区别与用法

    2019独角兽企业重金招聘Python工程师标准>>> 在Spar看中,我们知道一切的操作都是基于RDD的.在使用中,RDD有一种非常特殊也是非常实用的format--pair RD ...

  8. Spark中CheckPoint、Cache、Persist的用法、区别

    Spark中CheckPoint.Cache.Persist 大家好,我是一拳就能打爆A柱的猛男 这几天看到一套视频<尚硅谷2021迎新版大数据Spark从入门到精通>,其中有关于检查点( ...

  9. 【Spark】reduceByKey和GroupByKey

    尽可能的使用reduceByKey而不使用GroupByKey 1.区别

最新文章

  1. 模式的秘密-观察者模式(四)
  2. centos7配置 console口_centos7基本配置
  3. python Selenium 常见操作 元素定位
  4. ITK:计算两个3D点之间的距离
  5. 微软 SQL Server 2016 迁移技术培训实验营
  6. 对付镜像网站非常有效的办法
  7. jquery开发插件_如何开发jQuery插件
  8. 本周小结!(二叉树系列二)
  9. JDK-阻塞队列、非阻塞队列原理
  10. exe反编译为python语言_如何反编译Python写的exe到py
  11. 亲密接触Redis-第一天
  12. 统计学---总体与样本
  13. 计算机网络收集职业生涯规划的原则和步骤,职业生涯规划的步骤及原则介绍
  14. 计算机哪个方向就业好,计算机就业的几个方向
  15. NetBeans 尚未部署该模块错误 解决方案
  16. Git之Feature分支
  17. 高中生也能成为软件达人吗?
  18. PostgreSQL 基础模块---缓冲池管理
  19. 2023 WordPress收费下载资源插件erphpdown v9.8.2 美化版
  20. 浏览器运行java的方法_通过浏览器运行java程序的两种方法

热门文章

  1. AntV-G6实现微服务拓扑图
  2. mysql查询笔记_MySQL学习笔记(一):查询
  3. 如何快速定位页面(江湖故人就是个铁憨憨)即时相关性?
  4. 经典美文诵读2 If I Were a Boy Again假如我又回到了童年
  5. 微商做引流产品怎么做效果更好?为什么他人的生意这么好而自己没有生意呢?
  6. vue项目中画出优雅的线条(虚线、直线、折线、带箭头、流动效果等)
  7. R语言威尔科克森(Wilcoxon)分布
  8. 前端技术 | dva,美貌与智慧并存
  9. oracle分组查询最新的一条
  10. R语言学习-提取igraph的节点和边