2017-03-20 108 views
0

我想用Apache Pig來表徵具有某些屬性的行的分數。Apache Pig的基本統計信息

例如,如果數據的模樣:

a,15 
    a,16 
    a,17 
    b,3 
    b,16 

我想獲得:

a,0.6 
    b,0.4 

我努力做到以下幾點:

A = LOAD 'my file' USING PigStorage(','); 
    total = FOREACH (GROUP A ALL) GENERATE COUNT(A); 

這給我總=(5),但是當我試圖使用這個'總':

fractions = FOREACH (GROUP A by $0) GENERATE COUNT(A)/total; 

我得到一個錯誤。

很明顯COUNT()返回某種投影,兩個投影(在計算總數和分數中)應該是一致的。有沒有辦法做到這一點?或者也許只是爲了將總數作爲一個數字並避免這種投影一致性要求?

回答

0

出於某種原因,什麼@好奇,心態提出了以下修改作品:

total = FOREACH (GROUP A ALL) GENERATE COUNT(A); 
    rows = FOREACH (GROUP A by $0) GENERATE group as colname, COUNT(A) as cnt; 
    fractions = FOREACH rows GENERATE colname, cnt/(double)total.$0; 
1

您將有項目,並投它翻番:

total = FOREACH (GROUP A ALL) GENERATE COUNT(A); 
rows = FOREACH (GROUP A by $0) GENERATE group,COUNT(A); 
fractions = FOREACH rows GENERATE rows.$0,(double)rows.$1/(double)total.$0; 
+0

@ inquisitive-mind語法有問題嗎?此代碼無法在pig-12或pig-15中解析。對意外字符第4行第40列進行抱怨(假設LOAD操作是第1行)。謝謝! –

+0

@TnatsissaHCraeser嘗試點。 $ 0,(double)rows。$ 1 /(double)total。$ 0; –

+0

@nquisitive_mind解析,但以神祕的方式失敗(使用上面的例子):「標量在輸出中有多行,第一:(3,1),第二:(15,1)」。請注意,第一個來自b,第三個來自第二個來自輸入的15。這似乎表明,具有超過1行的神祕標量實際上是「全部」,如果是這樣,它可能是投影問題... –

1

另一種方式做同樣的:

test = LOAD 'test.txt' USING PigStorage(',') AS (one:chararray,two:int); 
B = GROUP test by $0; 
C = FOREACH B GENERATE group, COUNT(test.$0); 
D = GROUP test ALL; 
E = FOREACH D GENERATE group,COUNT(test.$0); 
F = CROSS C,E; 
G = FOREACH F GENERATE $0,$1,$3,(double)($1*100/$3); 

Output: 
(a,3,5,0.6) 
(b,2,5,0.4) 
+0

這完全有效,謝謝!不確定爲什麼另一種解決方案看起來更簡單。 –

+0

如果這有幫助,請您接受答案:) –

+0

我發佈了一個答案,它構成了我收到的另一個答覆的更正。我認爲在這種情況下最好不要使用CROSS,因爲至少在原則上計算量很大。 –