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)做到这一点?
答案 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。