2012-11-20 287 views
1
  • 我有兩列的表(COL1:字符串,COL2:布爾)
  • 比方說COL1 = 「AAA」
  • 對於COL1 = 「AAA」,也有很多 COL2的TRUE/FALSE值
  • 我要計算真值的COL1百分比(AAA)

輸入:計算百分比

aaa T 
aaa F 
aaa F 
bbb T 
bbb T 
ccc F 
ccc F 

輸出

COL1 TOTAL_ROWS_IN_INPUT_TABLE PERCENTAGE_TRUE_IN_INPUT_TABLE 
aaa  3       33% 
bbb  2       100% 
ccc  2       0% 

我將如何做到這一點使用PIG(拉丁)?

+0

我第一次拿到了總計數,然後過濾爲真實的,然後通過COL1合併。但我不確定這是否是正確的做法。 –

回答

2

In Pig 0.10 SUM(INPUT.col2)不起作用,因爲它將INPUT.col2作爲一袋布爾值處理,而bag不是原始類型,所以無法轉換爲布爾值。另一件事是,如果col2的輸入數據被指定爲布爾值,則輸入的轉儲沒有col2的任何值,但將其視爲chararray可以很好地工作。

豬非常適合這種類型的任務,因爲它具有通過嵌套在FOREACH中的操作符與單個組合作的手段。這裏是一個工作的解決方案:

inpt = load '....' as (col1 : chararray, col2 : chararray); 
grp = group inpt by col1; -- creates bags for each value in col1 
result = foreach grp { 
    total = COUNT(inpt); 
    t = filter inpt by col2 == 'T'; --create a bag which contains only T values 
    generate flatten(group) as col1, total as TOTAL_ROWS_IN_INPUT_TABLE, 100*(double)COUNT(t)/(double)total as PERCENTAGE_TRUE_IN_INPUT_TABLE; 
}; 

dump result; 

輸出:

(aaa,3,33.333333333333336) 
(bbb,2,100.0) 
(ccc,2,0.0) 
+0

我有我自己的soln類似這個 –

0

當您COUNTcol1中的每個鍵的記錄數時,您應該同時計數true值的數量。這樣整個事情就發生在一個MapReduce作業中。

grouped = group INPUT by col1 
OUTPUT = foreach grouped generate group, COUNT(INPUT), (double)SUM(INPUT.col2)/COUNT(INPUT); 

我在遺留系統上堅持Pig 0.9,所以我不熟悉新的布爾類型。如果可以在布爾值上使用SUM,那麼這應該足夠了。否則,您需要首先使用簡單的foreach/generate將布爾變換爲1和0。