MapReduce의 Map 및 Reduce에서 관계 이름을 사용하는 방법이 있습니까? Hadoop의 MapReduce를 사용하여 Set 차이를 만들려고합니다.Hadoop의 MapReduce에서 관계 이름/테이블 이름/파일 이름 사용
입력 : 2 개의 파일 R 및 S에는 용어 목록이 들어 있습니다.
목적 (암이 용어를 표시하기 위해 t을 사용하려고) : 찾을 R - S, R 및하지 S의 예 용어를
는접근 :는
매퍼 : t을 뱉어 -> R 또는 t -> S, t가 R 또는 S에서 오는지 여부에 따라 달라집니다. 따라서 맵 출력에는 키가 t이고 값으로 파일 이름이 있습니다.
감속기 : t의 값 목록에 R 만 포함 된 경우 t -> t를 출력합니다.
파일 이름에 용어를 태그하는 방법이 필요합니까? 아니면 다른 방법이 있습니까?
Set Union에 대한 소스 코드 (여기서는 파일 이름이 필요하지 않음). Mapper에서 파일 이름을 사용할 수 없음을 보여주기 위해 예제로 사용하고 싶었습니다.
public class Union {
public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, Text> {
public void map(LongWritable key, Text value, OutputCollector output, Reporter reporter) throws IOException {
output.collect(value, value);
}
}
public static class Reduce extends MapReduceBase implements Reducer<Text, Text, Text, Text> {
public void reduce(Text key, Iterator<Text> values, OutputCollector<Text, Text> output, Reporter reporter) throws IOException{
while (values.hasNext())
{
output.collect(key, values.next());
break;
}
}
}
public static void main(String[] args) throws Exception {
JobConf conf = new JobConf(Union.class);
conf.setJobName("Union");
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(Text.class);
conf.setMapperClass(Map.class);
conf.setCombinerClass(Reduce.class);
conf.setReducerClass(Reduce.class);
conf.set("mapred.job.queue.name", "myQueue");
conf.setNumReduceTasks(5);
conf.setInputFormat(TextInputFormat.class);
conf.setOutputFormat(TextOutputFormat.class);
FileInputFormat.setInputPaths(conf, new Path(args[0]));
FileOutputFormat.setOutputPath(conf, new Path(args[1]));
JobClient.runJob(conf);
}
}
나는 알 수 있듯이 어떤 키 - 값 쌍 (매퍼 입력)이 어떤 파일에서 왔는지 확인할 수 없습니다. 나는 여기서 간단한 것을 간과하고 있는가?
감사합니다.
감사 토마스. 내 질문을 내 코드 스 니펫으로 업데이트했습니다. 나는 그것이 나의 질문을 분명히하기를 바랍니다. 매퍼 내에서 파일 이름을 가져 오는 방법에 대해 더 우려하고 있습니다. – Arnkrishn
아 ~ 알았어;) "오래된"API에 익숙하지는 않지만 reporter.getInputSplit()을 사용하여 Reporter를 쿼리 할 수있다. InputSplit이라는 인터페이스를 반환합니다. 이것은 "FileSplit"에 쉽게 캐스팅 할 수 있습니다. 그리고 FileSplit 객체 내에서 "split.getPath()"를 사용하여 경로를 얻을 수 있습니다. 그리고 Path 객체에서 getName() 메서드를 호출하면됩니다. –
Thanks much Thomas :) 그것은 명백한 캐스트로 작업했습니다. – Arnkrishn