Spark经典案例2-数据去重
来源:互联网 发布:淘宝店铺怎么商品分类 编辑:程序博客网 时间:2024/05/22 04:28
/**
* 业务场景:数据去重问题
* Created by YJ on 2017/2/7.
* 统计数据,尽量用reduceByKey,不要用groupByKey,优化点
* reduceByKey,在本机suffle后,再发送一个总map,发送到一个总机器上汇总,(汇总要压力小)
* groupByKey,发送本机所有的map,在一个机器上汇总(汇总压力大)
*/
/*
数据格式
flie1:
2012-3-1 a
2012-3-2 b
2012-3-3 c
2012-3-4 d
2012-3-5 a
2012-3-6 b
2012-3-7 c
2012-3-3 c
flie2:
2012-3-1 b
2012-3-2 a
2012-3-3 b
2012-3-4 d
2012-3-5 a
2012-3-6 c
2012-3-7 d
2012-3-3 c
*/
package ClassicCaseimport org.apache.spark.{SparkConf, SparkContext}object case2 { def main(args: Array[String]): Unit = { val conf = new SparkConf().setMaster("local").setAppName("reduce") val sc = new SparkContext(conf) sc.setLogLevel("ERROR") //获取数据 val two = sc.textFile("hdfs://192.168.109.130:8020//user/flume/ClassicCase/case2/*") two.filter(_.trim().length>0) //需要有空格。 .map(line=>(line.trim,""))//全部值当key,(key value,"") .groupByKey()//groupByKey,过滤重复的key value ,发送到总机器上汇总 .sortByKey() //按key value的自然顺序排序 .keys.collect().foreach(println) //所有的keys变成数组再输出 //第二种有风险 two.filter(_.trim().length>0) .map(line=>(line.trim,"1")) .distinct() .reduceByKey(_+_) .sortByKey() .foreach(println) //reduceByKey,在本机suffle后,再发送一个总map,发送到一个总机器上汇总,(汇总要压力小) //groupByKey,发送本机所有的map,在一个机器上汇总(汇总压力大) //如果数据在不同的机器上,则会出现先重复数据,distinct,reduceBykey,只是在本机上去重,谨慎一点的话,在reduceByKey后面需要加多一个distinct }}
输出结果 2012-3-1 a
2012-3-1 b
2012-3-2 a
2012-3-2 b
2012-3-3 b
2012-3-3 c
2012-3-4 d
2012-3-5 a
2012-3-6 b
2012-3-6 c
2012-3-7 c
2012-3-7 d
(2012-3-1 a,1)
(2012-3-1 b,1)
(2012-3-2 a,1)
(2012-3-2 b,1)
(2012-3-3 b,1)
(2012-3-3 c,1)
(2012-3-4 d,1)
(2012-3-5 a,1)
(2012-3-6 b,1)
(2012-3-6 c,1)
(2012-3-7 c,1)
(2012-3-7 d,1)
reduceByKey和groupByKey区别与用法
(1)当采用reduceByKeyt时,Spark可以在每个分区移动数据之前将待输出数据与一个共用的key结合。借助下图可以理解在reduceByKey里究竟发生了什么。 注意在数据对被搬移前同一机器上同样的key是怎样被组合的(reduceByKey中的lamdba函数)。然后lamdba函数在每个区上被再次调用来将所有值reduce成一个最终结果。整个过程如下:
(2)当采用groupByKey时,由于它不接收函数,spark只能先将所有的键值对(key-value pair)都移动,这样的后果是集群节点之间的开销很大,导致传输延时。整个过程如下:
( 3 )区别
reduceByKey,在本机suffle后,再发送一个总map,发送到一个总机器上suffle汇总map,(汇总要压力小)
groupByKey,发送本机所有的map,在一个机器上suffle汇总map(汇总压力大)
因此,在对大数据进行复杂计算时,reduceByKey优于groupByKey。
另外,如果仅仅是group处理,那么以下函数应该优先于 groupByKey :
(1)、combineByKey 组合数据,但是组合之后的数据类型与输入时值的类型不一样。
(2)、foldByKey合并每一个 key 的所有值,在级联函数和“零值”中使用。
- Spark经典案例2-数据去重
- Hadoop经典案例Spark实现(二)——数据去重问题
- Hadoop 案例2----数据去重问题
- Spark经典案例3-数据排序
- 集合框架-去重字符串案例-2
- spark streaming去重
- Hadoop MapReduce应用案例——数据去重
- MapReduce编程案例——数据去重
- Spark根据key,按照一定条件对数据去重
- Spark 之 经典案例
- MR案例之去重
- ORACLE经典去重问题
- Python数据采集2--链接去重
- 词典去重数据
- hadoop-数据去重
- hive 去重数据
- SQL数据去重
- 数据去重
- const , volatile 关键字分析
- 如何修改int的打印内容——史上最难的JAVA面试题
- 推荐系统 Lenskit 初探(一)
- IO流_FileOutputStream的构造方法
- RAID扫盲篇之RAID的由来
- Spark经典案例2-数据去重
- Java 的10个谎言
- 最近看的一个小算法
- 静态广播、动态广播以及黏性广播的无序显示
- Hibernate笔记:JAR包导入,常用API,多对一配置
- HTML 小笔记
- 谷哥的小弟学后台(10)——Servlet(2)
- 获取本机ip
- SQL语句:统计男女的人数