2011-10-13 24 views
3

在PigLatin中,我想從其中一個記錄中選擇我想要選擇的其他字段,因爲這是一個集合,例如MAX豬:在GROUP後面拉個別字段

我無法解釋問題,所以這裏是一個例子。比方說,我想在一個家庭搶最古老的人的名字:

關係A是四列,(name, address, zipcode, age)

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 ???; 

如何生成與MAX年齡的人的名字嗎?

回答

4

你的邏輯問題是可能有更多的1人與MAX(年齡)。然後你必須GROUP BY(姓名,地址,年齡)。但爲了給你一個快速的答案,我會寫出只有最大年齡之一。 (我不知道它雖然最佳方式)

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

小心被接受體弱的答案,因爲這將有不良行爲,如果在LIMIT命令的數量大於1。特別是,在情況下,由於最後兩次FLATTEN呼叫,輸出將是所有年齡和名稱之間的交叉產品。然後,如果LIMIT中的值爲N,那麼將會有N^2個輸出行而不是預期的N.

更安全的是在GENERATE行中執行以下操作,它將提供與接受的結果完全相同的結果當使用'LIMIT 1'時回答:

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