[HADOOP] 2 개의 다른 소스 입력 파일에서 읽은 Hadoop 맵퍼
HADOOP2 개의 다른 소스 입력 파일에서 읽은 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.그것들이 같은 방식으로 분할되고 정렬되었다고 가정하면 CompositeInputFormat을 사용하여 맵 측 조인을 수행 할 수 있습니다. 여기에 사용에 대한 기사가 있습니다. 나는 그것이 새로운 mapreduce api로 이식되었다고 생각하지 않습니다.
그것들이 같은 방식으로 분할되고 정렬되었다고 가정하면 CompositeInputFormat을 사용하여 맵 측 조인을 수행 할 수 있습니다. 여기에 사용에 대한 기사가 있습니다. 나는 그것이 새로운 mapreduce api로 이식되었다고 생각하지 않습니다.
둘째, context.getInputSplit ()을 호출하여 매퍼에서 입력 파일을 가져올 수 있습니다. 그러면 InputSplit이 반환됩니다. TextSFormat을 사용하는 경우 FileInputSplit으로 캐스팅 한 다음 getPath ()를 호출하여 파일 이름을 가져올 수 있습니다. . TupleWritable의 Writables가 어디에서 왔는지 알 수 없으므로 CompositeInputFormat과 함께이 메소드를 사용할 수 있다고 생각하지 않습니다.
-
==============================
2.
String fileName = ((FileSplit) context.getInputSplit()).getPath() .toString(); if (fileName.contains("file_1")) { //TODO for file 1 } else { //TODO for file 2 }
from https://stackoverflow.com/questions/11495193/hadoop-mapper-reading-from-2-different-source-input-files by cc-by-sa and MIT license