2017-11-10 7 views
0

나는 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 단계를 사용하는 것과 같은 창의적인 것을 생각해 냈지만 작동하는 것으로는 보이지 않습니다.

감사합니다.

답변

0

감속기는 모든 데이터를 가져 오지만 데이터는 실제로 디스크에 기록되며 반복 가능한 값을 반복하면서 메모리로 가져옵니다. 사실, 반복에 의해 반환되는 객체는 각 값에 대해 재사용됩니다. 필드와 다른 상태는 객체가 전달되기 전에 간단히 대체됩니다.

즉, 동시에 모든 값 개체를 메모리에 저장하려면 값 개체를 명시 적으로 복사해야합니다.

내가 코드를 보면 메모리에 항목 쌍을 저장하지 않은 것처럼 보입니다. 당신은 항목 쌍을 직접 써서 당신이 선해야합니다.