복붙노트

[HADOOP] 2 개의 다른 소스 입력 파일에서 읽은 Hadoop 맵퍼

HADOOP

2 개의 다른 소스 입력 파일에서 읽은 Hadoop 맵퍼

많은 Mappers & Reducers를 연결하는 도구가 있으며 어느 시점에서 이전 맵 축소 단계의 결과를 병합해야합니다 (예 : 입력으로 데이터가있는 두 파일이 있음).

/input/a.txt
apple,10
orange,20

*/input/b.txt*
apple;5
orange;40

결과는 c.txt 여야합니다. 여기서 c.value = a.value * b.value

/output/c.txt
apple,50   // 10 * 5
orange,800 // 40 * 20

어떻게 할 수 있습니까? 간단한 Key => MyMapWritable (type = 1,2, value)을 도입하고 리듀서에 데이터를 병합 (실제로 곱하기) 하여이 문제를 해결했습니다. 작동하지만 :

해결법

  1. ==============================

    1.그것들이 같은 방식으로 분할되고 정렬되었다고 가정하면 CompositeInputFormat을 사용하여 맵 측 조인을 수행 할 수 있습니다. 여기에 사용에 대한 기사가 있습니다. 나는 그것이 새로운 mapreduce api로 이식되었다고 생각하지 않습니다.

    그것들이 같은 방식으로 분할되고 정렬되었다고 가정하면 CompositeInputFormat을 사용하여 맵 측 조인을 수행 할 수 있습니다. 여기에 사용에 대한 기사가 있습니다. 나는 그것이 새로운 mapreduce api로 이식되었다고 생각하지 않습니다.

    둘째, context.getInputSplit ()을 호출하여 매퍼에서 입력 파일을 가져올 수 있습니다. 그러면 InputSplit이 반환됩니다. TextSFormat을 사용하는 경우 FileInputSplit으로 캐스팅 한 다음 getPath ()를 호출하여 파일 이름을 가져올 수 있습니다. . TupleWritable의 Writables가 어디에서 왔는지 알 수 없으므로 CompositeInputFormat과 함께이 메소드를 사용할 수 있다고 생각하지 않습니다.

  2. ==============================

    2.

    String fileName = ((FileSplit) context.getInputSplit()).getPath()
                    .toString();
    
    if (fileName.contains("file_1")) {
       //TODO for file 1
    } else {
       //TODO for file 2
    }
    
  3. from https://stackoverflow.com/questions/11495193/hadoop-mapper-reading-from-2-different-source-input-files by cc-by-sa and MIT license