2013-06-21 4 views
0

그룹이 중첩 된 FOREACH 문에서 지원되지 않는 것 같습니다. 나는 다음과 같은 스키마가 : 나는 DATA1을 평평하게하려는중첩 FOREACH 문

data2: {group: chararray,data1: {(lt: chararray,ln: chararray)}} 

그룹 (LT, LN)의 모든 쌍, 계산, 주문 DESC를, 그리고 마지막으로 1

아이디어 추출하는 것입니다 제한 각 그룹에 대해 가장 가능성이 높은 (lt, ln) 쌍. 어떻게 그 일을하도록 나를 권하겠습니까?

답변

1

가장 빠른 실행을 위해 UDF가 가장 좋습니다. 순수 Apache Pig에서는 스키마와 관계를 만들기 전에 (group, lt, ln)을 계산할 수 있으면 좋을 것입니다. 그것은

Assuming load schema is (id, lt, ln) 

inpt = LOAD ....... as (id, lt : chararray, ln : chararray); 
grp1 = GROUP inpt BY (id, lt, ln); 
data1 = FOREACH grp FLATTEN(inpt), COUNT(data1) as cnt; 
data2 = GROUP data_wtih_count BY id; 
--data2: {group: chararray,data1: {(id, lt: chararray,ln: chararray, cnt : int)}} 
most_probable_pair = FOREACH data2 { 
    ord = ORDER data1 BY cnt ASC; 
    top = LIMIT ord 1; 
    GENERATE group, top.(ln, lt); 
} 

을 (디버깅을해야 할 수도 있습니다 그냥 의사 스크립트) 또는 당신은 데이터 2 및 데이터 1을 평평하고 grp1으로 시작할 수 같은 것을 할 수 woul.

+0

그것은 효과가 있었다. 빠른 질문 : UDF가 계산상의 비용이 덜들 것이라고 믿게 만드는 이유는 무엇입니까? 당신의 판단은 무엇을 기반으로합니까? – user2295350

+1

가방이 너무 크지 않다면 UDF보다 가방이 90MB 이하라고 생각합니다. 두 개가 아닌 "GROUP BY"가 하나만 빠져 나갈 수 있습니다. 각 "GROUP BY"는 하나의지도 축소 작업을 유발합니다. 필터링이없고 모든 데이터가 작업별로 그룹으로 전달되기 때문에 단일 그룹으로 UDF를 구현 한 경우 (단일 맵 축소 작업)에 비해 두 배의 시간이 소요됩니다. – alexeipab