Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于删除重复记录的Hadoop MapReduce程序_Hadoop - Fatal编程技术网

用于删除重复记录的Hadoop MapReduce程序

用于删除重复记录的Hadoop MapReduce程序,hadoop,Hadoop,有人能帮我写一个映射器和减缩器来合并这两个文件,然后删除重复的记录吗 以下是两个文本文件: file1.txt 2012-3-1a 2012-3-2b 2012-3-3c 2012-3-4d 2012-3-5a 2012-3-6b 2012-3-7c 2012-3-3c 和file2.txt: 2012-3-1b 2012-3-2a 2012-3-3b 2012-3-4d 2012-3-5a 2012-3-6c 2012-3-7d 2012-3-3c 这两个文件中是否都有一个共同的密钥来帮助

有人能帮我写一个映射器和减缩器来合并这两个文件,然后删除重复的记录吗

以下是两个文本文件:

file1.txt
2012-3-1a
2012-3-2b
2012-3-3c
2012-3-4d
2012-3-5a
2012-3-6b
2012-3-7c
2012-3-3c
和file2.txt:

2012-3-1b
2012-3-2a
2012-3-3b
2012-3-4d
2012-3-5a
2012-3-6c
2012-3-7d
2012-3-3c

这两个文件中是否都有一个共同的密钥来帮助识别记录是否匹配?如果是,则: 映射器输入:标准文本输入格式 映射器的输出键:公共键,映射器的输出值:整个记录。 At reducer:不需要迭代键,只需取一个值的实例进行写入即可

如果匹配或重复只有在完整记录匹配时才能结束:则 映射器输入:标准文本输入格式 映射器的输出键:整个记录,映射器的输出值:NullWritable。 At reducer:不需要迭代键。只需获取Key的一个实例,并将其作为值写入即可。
Reducer Output Key:Reducer Input Key,Reducer Output Value:NullWritable

一个简单的字数计算程序将为您完成这项工作。您需要做的唯一更改是,将Reducer的输出值设置为NullWritable。get()

以下是删除大型文本数据中重复行的代码,该代码使用哈希来提高效率:

DRMapper.java

import com.google.common.hash.Hashing;
导入org.apache.hadoop.io.LongWritable;
导入org.apache.hadoop.io.Text;
导入org.apache.hadoop.mapreduce.Mapper;
导入java.io.IOException;
导入java.nio.charset.StandardCharset;
类DRMapper扩展了Mapper{
私有文本哈希键=新文本();
私有文本mappedValue=新文本();
@凌驾
公共void映射(可长写键、文本值、上下文)
抛出IOException、InterruptedException{
字符串行=value.toString();
hashKey.set(Hashing.3_32().hashString(line,StandardCharsets.UTF_8.toString());
mappedValue.set(行);
write(hashKey,mappedValue);
}
}
DRReducer.java

import org.apache.hadoop.io.nullwriteable;
导入org.apache.hadoop.io.Text;
导入org.apache.hadoop.mapreduce.Reducer;
导入java.io.IOException;
公共类DRReducer扩展了Reducer{
@凌驾
公共void reduce(文本键、Iterable值、上下文)
抛出IOException、InterruptedException{
文本值;
if(values.iterator().hasNext()){
value=values.iterator().next();
if(!(value.toString().isEmpty()){
write(value,nullwriteable.get());
}
}
}
}
DuplicateRemover.java

import org.apache.hadoop.fs.Path;
导入org.apache.hadoop.io.Text;
导入org.apache.hadoop.mapreduce.Job;
导入org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
导入org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
公共类重复清除器{
私有静态final int DEFAULT_NUM_REDUCERS=210;
公共静态void main(字符串[]args)引发异常{
如果(参数长度!=2){
System.err.println(“用法:DuplicateRemover”);
系统退出(-1);
}
作业=新作业();
job.setJarByClass(DuplicateRemover.class);
job.setJobName(“重复移除器”);
addInputPath(作业,新路径(args[0]);
setOutputPath(作业,新路径(args[1]);
setMapperClass(DRMapper.class);
job.setReducerClass(DRReducer.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class);
job.setNumReduceTasks(默认的数值缩减器);
系统退出(作业等待完成(真)?0:1;
}
}
编译时使用:

javac -encoding UTF8 -cp $(hadoop classpath) *.java
jar cf dr.jar *.class
假设输入文本文件位于文件夹中,则以以下方式运行:

hadoop jar dr.jar in_folder out_folder

我只得到了上面两个文本文件,并被指示用java为mapper和reducer编写程序并编译程序,但我不知道如何做到这一点。没有公共键。在这种情况下,使用第二个选项,正如我在前面的评论中所说的:如果匹配或重复只能在完整记录匹配的情况下得出结论:那么映射器输入:Standard TextInputFormat映射器的输出键:整条记录和映射器的输出值:NullWritable。At reducer:不需要迭代键。只需获取Key的一个实例,并将其作为值写入即可。减速器输出键:减速器输入键,减速器输出值:NullWritable