1
  • 我有一个包含两列的表(col1:string,col2:boolean)
  • 可以说 col1 = "aaa"
  • 对于 col1 = "aaa",col2 有很多 True/False 值
  • 我想计算 col1 (aaa) 的 True 值的百分比

输入:

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

4

2 回答 2

3

在 Pig 0.10 SUM(INPUT.col2) 中不起作用并且无法转换为布尔值,因为它将 INPUT.col2 视为布尔值包,并且包不是原始类型。另一件事是,如果 col2 的输入数据被指定为布尔值,则输入的转储没有 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)
于 2012-11-20T23:57:34.123 回答
0

当您COUNT计算每个键的记录数时col1,您应该true同时计算值的数量。这样,整个事情就发生在一个 MapReduce 作业中。

grouped = group INPUT by col1
OUTPUT = foreach grouped generate group, COUNT(INPUT), (double)SUM(INPUT.col2)/COUNT(INPUT);

我在遗留系统上坚持使用 Pig 0.9,所以我不熟悉新的布尔类型。如果有可能SUM超过布尔值,那么这就足够了。否则,您需要使用简单的foreach/ generatefirst 将布尔值转换为 1 和 0。

于 2012-11-20T19:34:04.237 回答