복붙노트

[HADOOP] Mapreduce / Hadoop의 두 가지 데이터 세트 조인

HADOOP

Mapreduce / Hadoop의 두 가지 데이터 세트 조인

Hadoop의 두 데이터 세트간에 Natural-Join 연산을 구현하는 방법을 아는 사람이 있습니까?

더 구체적으로, 내가 정확히해야 할 일은 다음과 같다.

나는 두 세트의 데이터를 가지고있다.

보시다시피 tile_numbers는 두 데이터 세트간에 동일합니다. 이제 실제로 필요한 것은 각 tile_number를 기반으로이 두 데이터 세트를 결합하는 것입니다. 즉, 모든 tile_number에 대해 우리는 n point_id : point_info와 m line_id : line_info를가집니다. 내가하고 싶은 일은 모든 쌍의 point_id : point_info를 모든 line_id : line_info의 모든 쌍과 결합시키는 것입니다.

명확히하기 위해 다음 예를 참조하십시오.

포인트 쌍 :

(tile0, point0)
(tile0, point1)
(tile1, point1)
(tile1, point2)

라인 쌍 :

(tile0, line0)
(tile0, line1)
(tile1, line2)
(tile1, line3)

내가 원하는 것은 다음과 같다.

타일 ​​0 :

 (tile0, point0:line0)
 (tile0, point0:line1)
 (tile0, point1:line0)
 (tile0, point1:line1)

타일 ​​1 :

 (tile1, point1:line2)
 (tile1, point1:line3)
 (tile1, point2:line2)
 (tile1, point2:line3)

해결법

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

    1.제목을 키 및 점 / 선을 값으로 출력하는 매퍼를 값으로 사용하십시오. 포인트 출력 값과 라인 출력 값을 구별해야합니다. 예를 들어 특수 문자를 사용할 수 있습니다 (바이너리 방식이 훨씬 우수 할지라도).

    제목을 키 및 점 / 선을 값으로 출력하는 매퍼를 값으로 사용하십시오. 포인트 출력 값과 라인 출력 값을 구별해야합니다. 예를 들어 특수 문자를 사용할 수 있습니다 (바이너리 방식이 훨씬 우수 할지라도).

    따라서 맵 출력은 다음과 같습니다.

     tile0, _point0
     tile1, _point0
     tile2, _point1 
     ...
     tileX, *lineL
     tileY, *lineK
     ...
    

    그런 다음 감속기에서 입력 내용의 구조는 다음과 같습니다.

     tileX, [*lineK, ... , _pointP, ...., *lineM, ..., _pointR]
    

    값을 가지고 점과 선을 분리하고, 십자가를 만들고, 십자가의 각 쌍을 다음과 같이 출력해야합니다.

    tileX (lineK, pointP)
    tileX (lineK, pointR)
    ...
    

    이미 응용 프로그램 사양에 따라 포인트 값과 라인 값을 쉽게 구별 할 수있는 경우 특수 문자 (*, _)가 필요하지 않습니다.

    감속기에서 수행해야하는 교차 제품 관련 : 먼저 전체 값 목록을 반복하여 2 개의 목록으로 분리합니다.

     List<String> points;
     List<String> lines;
    

    그런 다음 두 개의 중첩 된 for 루프를 사용하여 교차 제품을 수행하십시오. 그런 다음 결과 목록과 각 요소 출력에 대해 반복합니다.

    tile(current key), element_of_the_resulting_cross_product_list
    
  2. ==============================

    2.기본적으로 여기에는 두 가지 옵션이 있습니다. 측면 조인을 줄이거 나지도 측 조인을 줄입니다.

    기본적으로 여기에는 두 가지 옵션이 있습니다. 측면 조인을 줄이거 나지도 측 조인을 줄입니다.

    여기서 그룹 키는 "타일"입니다. 하나의 감속기에서 점 쌍 및 선 쌍으로부터 모든 출력을 얻습니다. 그러나 배열의 포인트 쌍 또는 라인 쌍을 캐시해야합니다. 쌍 중 하나 (점 또는 선)가 너무 커서 단일 그룹 키 (각 고유 한 타일)에 대한 임시 배열 메모리에 맞지 않을 경우이 방법은 효과가 없습니다. 메모리에있는 단일 그룹 키 ( "타일")에 대해 키 쌍을 모두 보유 할 필요가 없다는 것을 기억하십시오.

    단일 그룹 키에 대한 두 키 쌍이 큰 경우지도 측 결합을 시도해야합니다. 그러나 몇 가지 고유 한 요구 사항이 있습니다. 그러나 두 데이터 모두에 대해 같은 수의 감속기를 실행하는 일부 맵 / 축소 작업을 통해 데이터를 사전 처리하여 이러한 요구 사항을 충족시킬 수 있습니다.

  3. ==============================

    3.나는 이것을 도움이되는 것으로 발견했다.

    나는 이것을 도움이되는 것으로 발견했다.

    일반 Map Reduce 또는 MultipleInputs와의 조인

    http://kickstarthadoop.blogspot.in/2011/09/joins-with-plain-map-reduce.html

  4. from https://stackoverflow.com/questions/11803450/join-of-two-datasets-in-mapreduce-hadoop by cc-by-sa and MIT license