利用MapReduce进行去重

利用MapReduce进行去重

对下列这段文本进行去重:

解题思想:

首先本题采用mapreduce那么肯定是要使用三个类:mapper,reducer和主启动类

其实考察的点是:reduce合并的时候按key合并,key不变将相同key的value值合并,所以只需要将key当做文本内容,value当做空即可,这样相同文本内容的就会合并,然后value置为空(不关注)。

mapper里面:

输入形式:key输入文本的行偏移量,value是行文本内容

输出的是:key为行文本内容,value是空

reducer里面:

输入形式:key为行文本内容,value是空

输出形式是:key为行文本内容,value是空

代码:

DeduplicationMapper

public class DeduplicationMapper extends Mapper<LongWritable, Text, Text, Text> {
  
    @Override
    protected void map(LongWritable key, Text value, Context context)
                    throws IOException, InterruptedException {
        //按行读取信息并作为mapper的输出键,mapper的输出值置为空文本即可
        Text line = value;
        context.write(line, new Text(""));
    }

}
DeduplicationReducer
 public class DeduplicationReducer extends Reducer<Text, Text, Text, Text> {

    @Override

    protected void reduce(Text key, Iterable<Text> value, Context context)
        //这个迭代器是由于同一个文本内容(key)可能有重复的,所以用迭代器存放-->接着将同一个key的value全置为空

            throws IOException, InterruptedException {

        //Reducer阶段直接按键输出即可,键直接可以实现去重

        context.write(key, new Text(""));

    }

}
TestDeduplication
 //主启动类
public class TestDeduplication {
    public static void main(String[] args) throws Exception {
        //先是配置
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://localhost:9000");//hdfs的位置
        //获取作业对象(接下来都是对job的操作)
        Job job = Job.getInstance(conf);//配置job

        //下面这几行常考
        //设置主类
        job.setJarByClass(TestDeduplication.class);//这个一定是启动类名称
    //设置job参数
        job.setMapperClass(DeduplicationMapper.class);
        job.setReducerClass(DeduplicationReducer.class);
//最终mapreduce输出内容的key,value类型 在本题都是文本,因为输出的key是文本,value是空文本
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);

        //设置job输入输出的位置
        FileInputFormat.addInputPath(job, new Path("/Deduplicationinfo.txt"));
        FileOutputFormat.setOutputPath(job, new Path("/simple/output"));
  //执行完毕成功返回0,否则返回1
        System.exit(job.waitForCompletion(true) ? 0 : 1);
        /*
在 Hadoop 的 MapReduce 编程中,job.waitForCompletion(boolean verbose) 方法用于提交作业并等待作业完成,
其中参数 verbose 是一个布尔类型的值,它控制着作业执行过程中的详细信息是否输出
1.当 verbose 参数设置为 true 时,Hadoop 会在作业执行过程中输出详细的日志信息,
这些信息会展示作业的进度、各个任务的执行情况、计数器的值等内容。通过这些详细信息,
你可以实时监控作业的执行状态,了解作业在每个阶段的具体情况,便于调试和排查问题。
2.当 verbose 参数设置为 false 时,Hadoop 不会输出作业执行过程中的详细日志信息,
只会在作业完成后返回作业的执行结果(成功或失败)。这种情况下,控制台的输出会比较简洁,
适合在生产环境中使用,避免过多的日志信息干扰。        
        */
    }
}

 

posted @ 2025-04-06 15:29  Annaprincess  阅读(30)  评论(0)    收藏  举报