计算猪查询中的百分比

时间:2012-11-20 15:36:04

标签: apache-pig

  • 我有一个包含两列的表(col1:string,col2:boolean)
  • 让我们说col1 =“aaa”
  • 对于col1 =“aaa”,有许多True / False值 col2
  • 我想计算col1(aaa)
  • 的真值百分比

INPUT:

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(LATIN)做到这一点?

2 个答案:

答案 0 :(得分:2)

在Pig 0.10 SUM(INPUT.col2)不起作用并且无法转换为布尔值,因为它将INPUT.col2视为一个布尔值包并且bag不是基本类型。另一件事是,如果col2的输入数据被指定为boolean,那么输入的转储没有col2的任何值,但将其视为chararray可以正常工作。

Pig非常适合这类任务,因为它可以通过使用嵌套在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)

答案 1 :(得分:0)

COUNT col1中每个密钥的记录数true时,您应该同时计算grouped = group INPUT by col1 OUTPUT = foreach grouped generate group, COUNT(INPUT), (double)SUM(INPUT.col2)/COUNT(INPUT); 个值的数量。这样,整个过程就发生在一个MapReduce作业中。

SUM

我在遗留系统上遇到Pig 0.9,所以我不熟悉新的布尔类型。如果foreach可以超过布尔值,那就足够了。否则,您需要首先使用简单generate / {{1}}将布尔值转换为1和0。