2013-06-21 154 views
0

看來,嵌套的FOREACH語句不支持該組。我有以下模式:嵌套的FOREACH語句

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

上,我要扁平化數據1,組中的所有對(LT,LN),計數,順序降序,並最終限制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開始。

+0

很好。有效。快速問題:是什麼讓你相信UDF的計算成本更低?你的判斷是基於什麼? – user2295350

+1

如果袋子不是太大,我認爲每個小於90MB,比使用UDF你可能得到一個「GROUP BY」而不是2。每個「GROUP BY」導致一個地圖縮減工作。由於沒有過濾,並且所有數據都通過操作分組進行,所以與通過(單個地圖縮減作業)的單個分組的UDF實施相比,它將花費兩倍的時間。 – alexeipab