Mapreduce实现数据去重

本文介绍了如何利用MapReduce进行数据去重。通过设置数据的key为数据本身,利用reduce阶段的特性,确保每个key只输出一次,从而达到去重目的。详细步骤包括设计思路、代码实现、数据准备、程序打包和运行。
摘要由CSDN通过智能技术生成

一、数据去重

要求:对多个数据文件进行去重。每行数据格式为“时间 字母”

1.1 设计思路

根据reduce的过程特性,会自动根据key来计算输入value的集合,把数据作为key输出传给reduce,则无论出现多少次,reduce最终结果中key只能输出一个。(map输出:<key,value-list>,value-list的个数即次数>
每个数据代表一行内容,所以map阶段任务即为把value设置为key并直接输出。map中结果经过shuffle后交给reduce。reduce阶段不管每个key有多少value,而是直接将输入的key复制为输出的key,并输出。

1.2 代码实现

public calss Dedup{
   
      // Mapper的四个参数:第一个Object表示输入key的类型;第二个Text表示输入value的类型;第三个Text表示表示输出键的类型;第四个IntWritable表示输出值的类型。
	  public static class Map extends Mapper<Object, Text, Text, IntWritable> {
   
	  	private static Text line=
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MapReduce是一种分布式计算框架,可以用于大规模数据处理。在MapReduce实现数据去重可以通过自定义Mapper和Reducer类来实现。具体步骤如下: 1. 自定义Mapper类,将输入数据作为键值对传递给Reducer类,其中键为输入数据,值为NullWritable。 2. 自定义Reducer类,接收Mapper类传递过来的数据,根据Shuffle工作原理,键值相同的数据会被合并,因此输出数据就不会出现重复数据了。 3. 在MapReduce作业中指定自定义的Mapper和Reducer类,并设置输入和输出路径。 下面是一个简单的MapReduce实现数据去重的例子: 1. 自定义Mapper类: ``` public class DeduplicateMapper extends Mapper<LongWritable, Text, Text, NullWritable> { private static Text field = new Text(); @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { field = value; context.write(field, NullWritable.get()); } } ``` 2. 自定义Reducer类: ``` public class DeduplicateReducer extends Reducer<Text, NullWritable, Text, NullWritable> { @Override protected void reduce(Text key, Iterable<NullWritable> values, Context context) throws IOException, InterruptedException { context.write(key, NullWritable.get()); } } ``` 3. 在MapReduce作业中指定自定义的Mapper和Reducer类,并设置输入和输出路径: ``` Job job = Job.getInstance(conf, "deduplicate"); job.setJarByClass(Deduplicate.class); job.setMapperClass(DeduplicateMapper.class); job.setReducerClass(DeduplicateReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(NullWritable.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值