2014-09-10 22 views
1

我試圖將記錄組合​​在一起,計算SCORE1的平均值,過濾出分數的下半部分,並計算它們的SCORE2的平均值。顯然,我可以計算摘要統計信息,並將它們重新加入到原始數據集中,但我更願意使用中間分組值。在嵌套FOREACH語句中重用豬羣

例輸入

ID,GROUPBY,SCORE1,SCORE2 
1,A,58.8,67.3 
2,A,85.2,76.3 
3,B,49.1,90.7 
4,B,78.3,99.8 

豬腳本

records = load 'example.csv' Using PigStorage(',') AS (ID,GROUPBY,SCORE1,SCORE2); 
grouped = group records by GROUPBY; 
avgscore = foreach grouped GENERATE group AS GROUPBY, AVG(records.SCORE1) AS AVGSCORE; 
joined = join grouped BY group, avgscore BY GROUPBY USING 'replicated'; 
results = foreach joined { 
    scores = foreach records generate SCORE1,SCORE2; 
    low = FILTER scores by SCORE1 < avgscore.AVGSCORE; 
    GENERATE GROUPBY, AVG(low.SCORE2); 
}; 
dump results; 

所需的輸出

A 67.3 
B 90.7 

但是這給了我java.lang.Exception的結果:org.apache.pig.backend.executionengine.ExecException:錯誤0:標量在輸出中有多行。第一個:(A,72.0),第二個:(B,63.7)

+1

1]您正在訪問AVGSCORE爲avgscore。 AVGSCORE,而它應該作爲avgscore :: AVGSCORE訪問。 2] 它不清楚你想達到什麼樣的代碼。你可以給我樣品我/ P和O/P? 3] Pig內部不支持GROUP內部嵌套的FOREACH操作。 – 2014-09-10 17:01:43

+0

我已根據您的要求添加了所需的輸出。 – user3532207 2014-09-10 17:51:21

+0

我完全不理解這個問題。 「計算SCORE1的平均值,過濾掉下半部分」,你的意思是什麼?......你的意思是過濾SCORE1小於平均值(SCORE1)的行或者用SCORE1最小值過濾掉一半行值? – 2014-09-11 05:45:10

回答

1

您基本上將第4行中的兩個不同數據結構分組。

你應該做的事:

joined = join records BY GROUPBY, avgscore BY GROUPBY USING 'replicated'; 

編輯: 我會改寫這樣的,以避免混淆(因爲會有兩個GROUPBYs)

records = load 'example.csv' Using PigStorage(',') AS (ID,GROUPBY,SCORE1,SCORE2); 
grouped = group records by GROUPBY; 
avgscore = foreach grouped GENERATE group AS GROUPBY, AVG(records.SCORE1) AS AVGSCORE; 
joined = join records BY GROUPBY, avgscore BY GROUPBY USING 'replicated'; 
joined_reduced = foreach joined generate ID, records::GROUPBY as GROUPBY, AVGSCORE, SCORE1, SCORE2; 
filter_joined = filter joined_reduced by (SCORE1 > AVGSCORE); 
grouped2 = group filter_joined by GROUPBY; 
result = foreach grouped2 generate flatten (group), AVG(filter_joined.SCORE2) as low_avg; 

dump result; 
+0

對不起,如果我很挑剔,但我很好奇,如果有一種可能的方式來使用已分組的行李進行計算。聽起來好像我想要這樣做,我將需要編寫一個UDF,或者,如您的示例所示,重新組合單個記錄。謝謝您的回覆。 – user3532207 2014-09-10 17:47:34

+0

我不確定你的意思,因爲我沒有添加額外的連接。 – Michal 2014-09-10 17:51:41

+0

也許你的意思是附加組合。由於您需要指定如何查找平均值,因此每次平均時都需要進行分組。所以既然你平均參加了兩次,那麼有兩個小組。真的不需要UDF。 – Michal 2014-09-10 17:55:29