2011-10-13 4 views
3

돼지 라틴에서 MAX과 같은 집계 때문에 선택하려는 레코드에서 다른 필드를 가져 오려고합니다.돼지 : GROUP 후 개별 필드를 당겨

문제를 설명하는 데 문제가 있으므로 여기에 예제가 나와 있습니다. 이 전 세대에서 가장 오래된 사람의 이름을 잡아하고 싶은 말은하자 A는 네 개의 열입니다

관계,

B = GROUP A BY (address, zipcode); # group by the address 

# generate the address, the person's age, but how do I grab that person's name? 
C = FOREACH B GENERATE FLATTEN(group), MAX(age), ??? Name ???; 

(name, address, zipcode, age)가 어떻게이 MAX 나이 사람의 이름을 생성합니까?

답변

4

논리에 문제가있는 경우 MAX (연령)가 1 명 이상일 수 있습니다. 그런 다음 GROUP BY (이름, 주소, 나이)를해야합니다. 그러나 당신에게 빠른 대답을하기 위해 필자는 최대 연령대 중 하나만 얻는다. (나는 확실하지 오전하지만 그 최적의 방법) 제한 명령의 숫자가 특히 높은 1보다 경우는 바람직하지 않은 행동을하는 것처럼

C = FOREACH B {       
    DA = ORDER A BY age DESC;     
    DB = LIMIT DA 1;       
    GENERATE FLATTEN(group), FLATTEN(DB.age), FLATTEN(DB.name); 
} 
+0

동점이 있으면 임의로 선택할 수 있습니다. 내 실제 데이터에서 MAX를 복용하는 것은 매우 드물게 넥타이입니다. 답변을 주셔서 감사합니다. 나는 그것을 밖으로 시도 할 것입니다 –

+1

당신은 환영 메이트, 그때 당신의 문제를 해결할 수 있기를 바랍니다 – frail

2

는 점에서, 허용됩니다 연약한의 대답에주의 출력은 마지막 두 번의 FLATTEN 호출로 인해 모든 연령대와 이름 간의 교차 곱 (cross-product)이됩니다. 그런 다음 LIMIT의 값이 N 인 경우 의도 한 N 대신 N^2 출력 행이 생깁니다.

GENERATE 행에서 다음을 수행하는 것이 훨씬 안전합니다. 'LIMIT 1'을 사용하는 경우 대답 :

GENERATE FLATTEN(group) AS (address, zipcode), FLATTEN(DB.(age, name)) AS (age, name);