나는 mapo reduce 프로그램을 가지고있다. 프로그램의 한 요소는 모든 쌍의 목록을 만드는 것이다.hadoop에서 값 목록의 모든 쌍 생성하기
item1 tag1
item2 tag1
item3 tag2
item4 tag1
item5 tag2
내지도 기능은 <tag, item>
쌍을 생성하므로 감속기의 입력으로 수신 <tag, List<item>>
예를 들어, 프로그램에 대한 입력 인 경우. , 값의 모든 목록, 그래서 본질적으로
item1-item2 tag1
item1-item4 tag1
item2-item4 tag1
item3-item5 tag2
을 모든 가능한 쌍을 생성하고, 각 쌍에게 키를합니다 감속기의 출력이 될 수 있도록 나의 목표이다.
작동하는 솔루션을 찾았지만 목록을 메모리로 복사하고 반복합니다.
public void reduce(Text key, Iterable<Text> values, Context context)
throws IOException, InterruptedException {
List<String> list = new ArrayList<String>();
for (Text t : values) {
list.add(t.toString());
}
for (int i=0; i<list.size()-1; i++) {
for (int j=i+1; j<list.size(); j++) {
out.set(list.get(i) + "-" + list.get(j))
context.write(out, one);
}
}
}
대안, 또는 하둡에 그 일을보다 효율적으로 방법이 있나요 : 이것은 내 데이터 세트가 매우 클 수 있기 때문에 문제가 될 수 있는가?
각 목록을 메모리에 복사하고 싶지 않습니다.
나는 다른 map-reduce 단계를 사용하는 것과 같은 창의적인 것을 생각해 냈지만 작동하는 것으로는 보이지 않습니다.
감사합니다.