我試圖將記錄組合在一起,計算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]您正在訪問AVGSCORE爲avgscore。 AVGSCORE,而它應該作爲avgscore :: AVGSCORE訪問。 2] 它不清楚你想達到什麼樣的代碼。你可以給我樣品我/ P和O/P? 3] Pig內部不支持GROUP內部嵌套的FOREACH操作。 – 2014-09-10 17:01:43
我已根據您的要求添加了所需的輸出。 – user3532207 2014-09-10 17:51:21
我完全不理解這個問題。 「計算SCORE1的平均值,過濾掉下半部分」,你的意思是什麼?......你的意思是過濾SCORE1小於平均值(SCORE1)的行或者用SCORE1最小值過濾掉一半行值? – 2014-09-11 05:45:10