当前位置: 首页 > news >正文

Hadoop学习总结(MapReduce的数据去重)

      现在假设有两个数据文件

file1.txtfile2.txt
2018-3-1 a
2018-3-2 b
2018-3-3 c
2018-3-4 d
2018-3-5 a
2018-3-6 b
2018-3-7 c
2018-3-3 c
2018-3-1 b
2018-3-2 a
2018-3-3 b
2018-3-4 d
2018-3-5 a
2018-3-6 c
2018-3-7 d
2018-3-3 c

      上述文件 file1.txt 本身包含重复数据,并且与 file2.txt 同样出现重复数据,现要求使用 Hadoop 大数据相关技术对这两个文件进行去重操作,并最终将结果汇总到一个文件中。

一、MapReduce 的数据去重

二、案例实现

1、Map 阶段实现

DedupMapper.java

package com.itcast.dedup;//import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;public class DedupMapper extends Mapper<LongWritable, Text,Text, NullWritable> {//重写Ctrl+o@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//        <0,2018-3-1 a> <11,2018-3-2 b>
//        NullWritable.get() 方法设置空值context.write(value, NullWritable.get());}
}

      该代码的作用是为了读取数据集文件将 TextInputFormat 默认组件解析的类似 <0,2018-3-1 a> 键值对修改  <2018-3-1 a,null>

2、Reduce 阶段实现

DedupReducer.java

package com.itcast.dedup;//import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;public class DedupReducer extends Reducer<Text, NullWritable,Text,NullWritable> {@Overrideprotected void reduce(Text key, Iterable<NullWritable> values, Context context) throws IOException, InterruptedException {//<2018-3-1 a,null> <11,2018-3-2 b,null> <11,2018-3-3 c,null>context.write(key,NullWritable.get());}
}

      该代码的作用仅仅是接受 Map 阶段传递来的数据,根据 Shuffle 工作原理,键值 key 相同的数据就不会被合并,因此输出数据就不会出现重复数据了。

3、Dtuver 程序主类实现

DedupDriver.java

package com.itcast.dedup;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
//import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;import java.io.IOException;public class DedupDriver {public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {//通过 Job 来封装本次 MR 的相关信息Configuration conf = new Configuration();//System.setProperty("HADOOP_USER_NAME","root");//配置 MR 运行模式,使用 local 表示本地模式,可以省略
//        conf.set("mapreduce.framework.name","local");Job job = Job.getInstance(conf);//指定 MR Job jar 包运行主类job.setJarByClass(DedupDriver.class);//指定本次 MR 所有的 Mapper Reducer 类job.setMapperClass(DedupMapper.class);job.setReducerClass(DedupReducer.class);//设置业务逻辑 Mapper 类的输出 key 和 value 的数据类型job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(NullWritable.class);//设置业务逻辑 Reducer 类的输出 key 和 value 的数据类型job.setOutputKeyClass(Text.class);job.setOutputValueClass(NullWritable.class);//使用本地模式指定处理的数据所在的位置//{input2\*} 表示读取该路径下所有的文件FileInputFormat.setInputPaths(job,"D:\\homework2\\Hadoop\\mr\\{input2\\*}");//使用本地模式指定处理完成之后的结果所保存的位置FileOutputFormat.setOutputPath(job, new Path("D:\\homework2\\Hadoop\\mr\\output"));//提交程序并且监控打印程序执行情况boolean res = job.waitForCompletion(true);//执行成功输出 0 ,不成功输出 1System.exit(res ? 0 : 1);}
}

运行结果:

 三、拓展

        只要日期相同,就判定为相同,最后结果输出日期即可

只需要修改DedupMapper.java文件

package com.itcast.dedup;//import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;public class DedupMapper extends Mapper<LongWritable, Text,Text, NullWritable> {//重写Ctrl+o@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {//输出日期// 把 hadoop 类型转换为 java 类型(接收传入进来的一行文本,把数据类型转换为 String 类型)String line = value.toString();// 把字符串拆分为单词String[] words = line.split(" ");// 输出前面的内容String wo = words[0];context.write(new Text(wo), NullWritable.get());}
}

运行结果:

相关文章:

  • 基于安卓android微信小程序的刷题系统
  • K8S部署mongodb-sharded-cluster(7.0.2)副本分片
  • 技术面时,一定要掌握这3个关键点
  • MySQL-02-InnoDB存储引擎
  • 22款奔驰S400L升级原厂360全景影像 高清环绕 无死角
  • 【php】解决加载速度慢导出超时问题记录
  • STM32分区跳转问题
  • docker-compose 服务编排
  • 企业微信身份验证
  • 2023全球数字贸易创新大赛-人工智能元宇宙-11-12,数据二十条,数字产业化和产业数字化
  • 【bug】uniapp的image组件渲染gif图,只有第一次点击的时候有动效,需要每次点击都有gif效果,已解决
  • 【音视频-FFMPEG相关命令使用】
  • SELinux零知识学习二十五、SELinux策略语言之类型强制(10)
  • 微信小程序面试题【100道】
  • ORA-28003: password verification for the specified password failed,取消oracl密码复杂度
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • Angular2开发踩坑系列-生产环境编译
  • Cumulo 的 ClojureScript 模块已经成型
  • Docker入门(二) - Dockerfile
  • gitlab-ci配置详解(一)
  • HTTP那些事
  • interface和setter,getter
  • Iterator 和 for...of 循环
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • mysql innodb 索引使用指南
  • node和express搭建代理服务器(源码)
  • Protobuf3语言指南
  • Python学习之路13-记分
  • Redux 中间件分析
  • 工作中总结前端开发流程--vue项目
  • 关于使用markdown的方法(引自CSDN教程)
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 由插件封装引出的一丢丢思考
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​【已解决】npm install​卡主不动的情况
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • #HarmonyOS:基础语法
  • #if 1...#endif
  • $jQuery 重写Alert样式方法
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (7)STL算法之交换赋值
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (十八)SpringBoot之发送QQ邮件
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (五)Python 垃圾回收机制
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)EOS中账户、钱包和密钥的关系
  • ***监测系统的构建(chkrootkit )
  • .bat批处理(六):替换字符串中匹配的子串