2013-12-10 1 views
1

돼지 0.8.1을 사용하고 있습니다. 나는 돼지에 다소 익숙하지 만, 내 튜플을 어떻게 사용하고 싶은지에 대한 합리적이고 재사용 가능한 솔루션이 있어야한다는 것을 알고 있습니다. 나는 (트리플 유사)의 형식은 다음과 같습니다많은 키/값 튜플을 돼지의 단일 튜플로 결합 및 병합

Schema: (uuid, key, val) 

Data: 
(id1, 'name', 'Corey') 
(id1, 'location', 'USA') 
(id1, 'carsOwned', 5) 
(id2, 'name', 'Paul') 
(id2, 'location', 'CANADA') 
(id2, 'carsOwned', 10) 

는 다중 값 키를 가질 수 있습니다, 그래서지도에 데이터를 밀어하는 것은 문제가 있기 때문에 내가 트리플에서이 데이터를 표현하고있어 그 이유는 문제.

내가 할 수 있어야하는 것은 상위 10 대가 소유 한 사람의 ID, 이름 및 위치를 찾는 것입니다. 내 출력 형식이 될 수 있다면 내림차순으로 정렬 할 때 내가 좋아하는 것 : 나는 3 가지 별칭 (하나의 키 == '이름', 하나의 키에 내 입력을 필터링 시도

Schema: (uuid, name, location, carsOwned) 

Data: 
(id2, 'Paul', 'CANADA', 10) 
(id1, 'Corey', 'USA', 5) 

== 'location'과 key == 'carsOwned')를 사용하여 JOIN을 사용하여 다시 한 튜플로 가져올 수 있지만 Pig는 inputFormat에서로드하는 대신 3 번로드하는 것으로 나타납니다. 어쩌면 내가 잘못하고있는 걸까요?

나는 또한 ID별로 그룹화를 시도했지만 실제 똑같은 스키마를 가지고 있기 때문에 실제 트리플 키/값의 백과 함께 작업하는 합리적인 방법을 찾지 못하는 것 같습니다.

실제로 원하는 것은 id 필드로 그룹화 한 다음 각 키를 평평하게하고 별칭을 실제 키 이름으로 바꾸는 것입니다.

아이디어가 있으십니까? 미리 감사드립니다!

답변

2

이 솔루션은 돼지가 실제로 설정되어있는 방식으로 데이터가 구성되지 않았기 때문에 조금 엉성한 것입니다. 즉, 개념적으로 각 ID는 행 키가됩니다. 두 번째 열. 그러나 데이터가 모두 합리적인 한이 작업을 수행 할 수 있습니다. 동일한 ID와 필드 이름을 가지고 있지만 값이 다른 여러 행으로 잘못 입력하면이 작업이 복잡해집니다.

당신이 관심있는 세 개의 필드의 값을 선택하는 중첩 된 foreach 문을 사용합니다.

keyedByID = 
    /* Gather the rows by ID, then process each one in turn */ 
    FOREACH (GROUP Data BY id) { 
     /* Pull out the fields you want. If you have duplicate rows, 
      you'll need to use a LIMIT statement to ensure just a single record */ 
     name = FILTER Data BY field == 'name'; 
     location = FILTER Data BY field == 'location'; 
     carsOwned = FILTER Data BY field == 'carsOwned'; 
    GENERATE 
     /* Output each field you want. You'll need to use FLATTEN since 
      the things created above in the nested foreach are bags. */ 
     group AS id, 
     FLATTEN(name) AS name, 
     FLATTEN(locatioN) AS location, 
     FLATTEN(carsOwned) AS carsOwned; 
    }; 

는 이제 하나의 행에의 ID에 대한 모든 정보를 넣 관계를 가지고, 당신이 원하는대로 그것을 할 수 있습니다. 예를 들어 상위 10 명의 자동차 소유자를 찾아 내고 싶다고 말한 경우 :

ordered = ORDER keyedByID BY carsOwned DESC; 
top10 = LIMIT ordered 10; 
+0

이렇게하면 효과가 있습니다. 감사! –

관련 문제