2011-01-19 2 views
1

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); 
     } 
} 

나는 알 수 있듯이 어떤 키 - 값 쌍 (매퍼 입력)이 어떤 파일에서 왔는지 확인할 수 없습니다. 나는 여기서 간단한 것을 간과하고 있는가?

감사합니다.

답변

3

나는 대답 한 것처럼 질문을 구현할 것입니다. 이것이 MapReduce가 의도했던 방식입니다.
문제가 실제로 n 배의 HDFS 값을 쓰고 있었다고 생각하십니까?

편집 : 거기 내가 그것을 가지고

아 내 의견에서 붙여, 나는 "오래된"API 정말 익숙하지 않은 해요),하지만 할 수 있습니다 "쿼리"당신의 기자와 :

reporter.getInputSplit(); 

이렇게하면 InputSplit이라는 인터페이스가 반환됩니다. 이것은 "FileSplit"에 쉽게 캐스팅 할 수 있습니다. 그리고 FileSplit 객체 내에서 "split.getPath()"를 사용하여 경로를 얻을 수 있습니다. 그리고 Path 객체에서 getName() 메서드를 호출하면됩니다.

그래서이 조각은 당신을 위해 작동합니다 :

FileSplit fsplit = reporter.getInputSplit(); // maybe cast it down to FileSplit if needed.. 
String yourFileName = fsplit.getPath().getName(); 
+0

감사 토마스. 내 질문을 내 코드 스 니펫으로 업데이트했습니다. 나는 그것이 나의 질문을 분명히하기를 바랍니다. 매퍼 내에서 파일 이름을 가져 오는 방법에 대해 더 우려하고 있습니다. – Arnkrishn

+0

아 ~ 알았어;) "오래된"API에 익숙하지는 않지만 reporter.getInputSplit()을 사용하여 Reporter를 쿼리 할 수있다. InputSplit이라는 인터페이스를 반환합니다. 이것은 "FileSplit"에 쉽게 캐스팅 할 수 있습니다. 그리고 FileSplit 객체 내에서 "split.getPath()"를 사용하여 경로를 얻을 수 있습니다. 그리고 Path 객체에서 getName() 메서드를 호출하면됩니다. –

+1

Thanks much Thomas :) 그것은 명백한 캐스트로 작업했습니다. – Arnkrishn

관련 문제