2012-02-04 2 views
4

나는이 질문에 잠시 머물렀다. 다음과 같은 데이터 파일이 있습니다.돼지의 가방 값으로 묶기

2012/01/01  Name1  "Category1,Category2,Category3" 
2012/01/01  Name2  "Category2,Category3" 
2012/01/01  Name3  "Category1,Category5" 

각 항목은 쉼표로 구분 된 범주 목록과 연결됩니다. 나는 다음과 같은 출력을 얻을, 카테고리 이름으로 그룹 수 있도록하고 싶습니다 :

Category1 Name1, Name3 
Category2 Name1, Name2 
... 
Category5 Name3 

(심지어 더 구체적으로, 나는 항목의 이름이 필요하지 않습니다 - 그 항목의 수의 단지 수를 카테고리가 할 것이다)

나는 쉼표로 구분 된 카테고리 필드를 가져 와서 돼지 가방으로 변환하는 UDF를 작성했다. 내 데이터 스키마는 다음과 같습니다. {date: chararray, name: chararray, categories: {t: (category:chararray)}}

실제로는 중첩 된 값으로 그룹화를 수행합니다. 행운없이 FOREACH 중첩 구문을 변형 해 보았습니다. 예를 들어 :

x = FOREACH myData 
{ 
categoryNames = FOREACH categories GENERATE category; 
GENERATE myData.Name, categoryNames; 
} 

내 생각은 구문의 종류는 내가 이상 그룹을 실행할 수 있습니다 (이름, 카테고리)의 튜플을 생성 할 수있는 것이 었습니다. 그러나 실제 출력은 가방 전체입니다. 다시 제곱 1로 돌아갑니다. 진행 방법에 대한 아이디어가 없습니다. 도움/피드백이 가장 잘 평가 될 것입니다. 감사!

답변

5

데이터 파일에서 각 이름이 고유하다고 가정하면 FLATTEN 카테고리의 가방을 입력 한 다음 GROUP 카테고리로 입력하고 COUNT 카테고리로 이름 수를 입력 할 수 있습니다.

name_category = 
    FOREACH data 
    GENERATE 
     name, 
     FLATTEN(categories) AS category; 

category_group = 
    GROUP name_category 
    BY category; 

category_count = 
    FOREACH category_group 
    GENERATE 
     FLATTEN(group) AS category, 
     COUNT(name_category) AS count; 
+0

가방에 붙어있는 FLATTEN의 동작이 여러개의 튜플을 생성한다는 것을 알지 못했습니다. 정확히 달성하려고 시도한 것입니다. 감사! – Inverseofverse