使用Apache Pig通过AVG过滤

时间:2013-05-15 06:43:52

标签: apache-pig

我有一个文件“error_data.txt”,如下所示:

10474   3.0 2013-05-01  7
10474   94.0    2013-05-01  3
10538   72.0    2013-05-01  15
11001   95.0    2013-05-01  248
13113   78.0    2013-05-01  18
13116   53.0    2013-05-01  4
13116   95.0    2013-05-01  1
13122   89.0    2013-05-01  2
10001   56.0    2013-05-02  7
10413   61.0    2013-05-02  6
.........
.........

这就是我现在所拥有的,它运作良好:

error_data = LOAD 'error_data.txt' AS (ppapi_error_code:int, api_version:chararray, day:chararray, count:long);
filtered_data = FILTER error_data BY api_version=='61.0';                                                      
grouped_data = GROUP filtered_data BY day;                                                                     
grouped_count = FOREACH grouped_data GENERATE group AS day, SUM(filtered_data.count) AS error_count;
STORE grouped_count INTO 'out_1';

现在我要做的是过滤grouped_count那些error_count大于平均值的值。

我已获得如下平均值:

grouped_count_bag = GROUP grouped_count ALL;
average = FOREACH grouped_count_bag GENERATE AVG(grouped_count.error_count);

当我DUMP时,我将元组中的值设为(578.9444444444445)。我现在能够使用值

过滤它
filtered_grouped_count = FILTER grouped_count BY (error_count>578.9444444444445);

但我想以

的方式做到这一点
filtered_grouped_count = FILTER grouped_count BY (error_count>average);

似乎不被允许。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

average = FOREACH grouped_count_bag GENERATE AVG(grouped_count.error_count) AS avg;
grouped_count_average = CROSS grouped_count, average;
filtered_grouped_count = FILTER grouped_count_average BY (error_count>avg);

我知道CROSS看起来很浪费,但据我所知,这是唯一的方法。