为什么这串代码无法实现文件的去重: public static void main(String[] args) throws Exception{ System.setProperty("username","hadoop234"); Configuration conf = new Configuration(); conf.set("fs.default.name", "hdfs://localhost:9000"); FileSystem fs = FileSystem.get(conf); int len = args.length; if(fs.exists(new Path(args[len-1]))) { fs.delete(new Path(args[len-1]),true); } Job job = Job.getInstance(conf,"Merge and duolicate removal"); job.setJarByClass(quchong.class); job.setMapperClass(MyMapper.class); job.setReducerClass(MyReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(Text.class); for(int i=0;i<len-1;++i) { FileInputFormat.addInputPath(job, new Path(args[i])); } FileOutputFormat.setOutputPath(job, new Path(args[len-1])); System.exit(job.waitForCompletion(true) ? 0 : 1); fs.close(); }
时间: 2024-01-30 17:04:05 浏览: 67
这段代码中并没有实现去重,因为在 MapReduce 任务中实现去重通常需要借助 Map 和 Reduce 的聚合功能。而这段代码只是设置了一个 Map 和 Reduce 的类,但并没有在类中实现去重逻辑。
如果想要实现文件的去重,需要在 MyMapper 和 MyReducer 类中添加代码来实现。具体来说,MyMapper 类中需要实现将输入文件中的每一行数据作为 key,value 为 null 的键值对输出。然后在 MyReducer 类中,可以利用 MapReduce 框架自动将相同 key 的数据聚合在一起的特性,只输出一个 key,将 value 设置为 null,这样就实现了去重。
这里提供一个简单的伪代码实现:
```java
public class MyMapper extends Mapper<LongWritable, Text, Text, NullWritable> {
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
// 将每一行数据作为 key,value 为 null 的键值对输出
context.write(value, NullWritable.get());
}
}
public class MyReducer extends Reducer<Text, NullWritable, Text, NullWritable> {
@Override
protected void reduce(Text key, Iterable<NullWritable> values, Context context) throws IOException, InterruptedException {
// 直接将 key 输出,value 设置为 null,实现去重
context.write(key, NullWritable.get());
}
}
```
阅读全文