1 实例描述

对数据文件中的数据进行去重。数据文件中的每行都是一个数据

样例输入如下所示:
1)file1

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

2)file2

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

期望输出:

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

2 问题分析

数据去重的最终目标是让原始数据中出现次数超过一次的数据在输出文件中只出现一次。

分析:
根据reduce的过程特性,会自动根据key来计算输入的value集合
把数据作为key输出给reduce,无论这个数据出现多少次,reduce最终结果中key只能输出一次。

3.实现步骤

实例中每个数据代表输入文件中的一行内容,map阶段采用Hadoop默认的作业输入方式。
       将value设置为key,并直接输出。 map输出数据的key为数据,将value设置成空值
2.    在MapReduce流程中,map的输出<key,value>经过shuffle过程聚集成<key,value-list>后会交给reduce
3.    reduce阶段不管每个key有多少个value,它直接将输入的key复制为输出的key,并输出(输出中的value被设置成空)。

4.关键代码

package com.mk.mapreduce;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;import java.io.IOException;
import java.net.URI;public class Distinct {public static class DistinctMapper extends Mapper<LongWritable, Text, Text, NullWritable> {@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {value.set(value.toString().trim());context.write(value, NullWritable.get());}}public static class DistinctReducer extends Reducer<Text,NullWritable, Text, NullWritable> {@Overrideprotected void reduce(Text key, Iterable<NullWritable> values, Context context) throws IOException, InterruptedException {context.write(key, NullWritable.get());}}public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {String uri = "hdfs://192.168.150.128:9000";String input = "/distinct/input";String output = "/distinct/output";Configuration conf = new Configuration();if(System.getProperty("os.name").toLowerCase().contains("win"))conf.set("mapreduce.app-submission.cross-platform","true");FileSystem fileSystem = FileSystem.get(URI.create(uri), conf);Path path = new Path(output);fileSystem.delete(path,true);Job job = new Job(conf,"Distinct");job.setJar("./out/artifacts/hadoop_test_jar/hadoop-test.jar");job.setJarByClass(Distinct.class);job.setMapperClass(DistinctMapper.class);job.setCombinerClass(DistinctReducer.class);job.setReducerClass(DistinctReducer.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(NullWritable.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(NullWritable.class);FileInputFormat.addInputPaths(job, uri + input);FileOutputFormat.setOutputPath(job, new Path(uri + output));boolean ret = job.waitForCompletion(true);System.out.println(job.getJobName() + "-----" +ret);}
}

Hadoop入门(十四)Mapreduce的数据去重程序相关推荐

  1. 2021年大数据Hadoop(十四):HDFS的高可用机制

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 HDFS的高可用机制 HDFS高可用介绍 组件介绍 Nam ...

  2. python3行3列文件数据赋值_Python3快速入门(十四)——Pandas数据读取

    Python3快速入门(十四)--Pandas数据读取 一.DataFrame IO 1.CSV文件 pandas.read_csv(filepath_or_buffer, na_values='NA ...

  3. Python3快速入门(十四)——Pandas数据读取

    Python3快速入门(十四)--Pandas数据读取 一.DataFrame IO 1.CSV文件 pandas.read_csv(filepath_or_buffer, na_values='NA ...

  4. MapReduce的数据去重功能

    实验材料及说明 现有某电商网站用户对商品的收藏数据,记录了用户收藏的商品id以及收藏日期,文件名为buyer_favorite.buyer_favorite包含:买家id,商品id,收藏日期这三个字段 ...

  5. 实践数据湖iceberg 第三十四课 基于数据湖icerberg的流批一体架构-流架构测试

    系列文章目录 实践数据湖iceberg 第一课 入门 实践数据湖iceberg 第二课 iceberg基于hadoop的底层数据格式 实践数据湖iceberg 第三课 在sqlclient中,以sql ...

  6. WCF技术剖析之十四:泛型数据契约和集合数据契约(下篇)

    [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经>为此录制的节目视频(苏州话)]]在.NET中,所有的集合都实现了IEnumerable接口,比如Arra ...

  7. WCF技术剖析之十四:泛型数据契约和集合数据契约(上篇)

    在.NET Framework 2.0中,泛型第一次被引入.我们可以定义泛型接口.泛型类型.泛型委托和泛型方法.序列化依赖于真实具体的类型,而泛型则刻意模糊了具体类型概念.而集合代表一组对象的组合,集 ...

  8. 微信小程序(第二十四章)- 数据交互前置

    微信小程序(第二十四章)- 数据交互前置 讲解微信小程序前置的原因 参考文档 理解微信小程序 小程序简介 作用 提问 针对提问--uni-app介绍 小程序和普通网页开发的区别 小程序代码构成 文件个 ...

  9. 七年级计算机第十四课编排表格,浙教版 信息技术七年级上 第十四课 编辑数据表 教案设计.doc...

    第十四课 编辑数据表 一.教学目标 知识与技能: 1.掌握单元格的插入的方法.单元格的合并和居中.调整单元格大小 ; 2.掌握单元格数据对齐方式的设置.单元格字体.字号.字体颜色的设置; 3.掌握单元 ...

最新文章

  1. cuda win10安装
  2. 组合数学(全排列)+DFS CSU 1563 Lexicography
  3. 发现IE7 Quick Tabs内容同步有bug
  4. Angular js 具体应用(一)
  5. MapReduce多表连接
  6. 【参数】REMOTE_LOGIN_PASSWORDFILE参数三种取值及其行为特性分析
  7. Google,真的要离我们而去吗?
  8. java 课后习题 删除奇数元素下标 然后再删除值为奇数的下标
  9. mysql字段作用_mysql用户表host字段作用
  10. 测试中常见bug总结
  11. 对于目前流行的量化投资与smart beta策略的一些看法
  12. vuejs中的回车事件
  13. matlab高斯型积分,电子科大MATLAB第14节高斯型积分程序.ppt
  14. 分享一个好用的图吧电脑工具
  15. Mixly第三方库开发
  16. scrapy ,Selenium 企查查模拟登录
  17. CRT的快捷键 不会的快....
  18. 人才招聘网站设计代码(毕业设计和课程设计)
  19. uniapp开发环境搭建
  20. 大整理!程序员最爱的12个免费Python课程

热门文章

  1. 两台思科交换机vlan划分_Cisco交换机Vlan划分及ACL配置详细步骤 | 吴文辉博客
  2. mysql 默认事务隔离级别_MySQL 事务隔离级别详解
  3. leetcode面试题 02.07. 链表相交
  4. linux多行变一列,多行转为一列
  5. redhat java 多个版本_Linux下安装JDK(多个版本) 切换
  6. [Spring5]IOC容器_Bean管理_bean的作用域和bean的生命周期
  7. [JavaWeb-Bootstrap]Bootstrap响应式布局
  8. [设计模式]简单工厂和工厂方法模式适用场景
  9. #10017 「一本通 1.2 练习 4」传送带+三分套三分
  10. 微信小程序点击按钮弹出弹窗_微信小程序实现的点击按钮 弹出底部上拉菜单功能示例...