Apache pig 计算pig查询中的百分比 我有一个有两列的表(col1:string,col2:boolean) 让我们说col1=“aaa” 对于col1=“aaa”,有许多的真/假值 可乐 我想计算col1(aaa)的真值百分比

Apache pig 计算pig查询中的百分比 我有一个有两列的表(col1:string,col2:boolean) 让我们说col1=“aaa” 对于col1=“aaa”,有许多的真/假值 可乐 我想计算col1(aaa)的真值百分比,apache-pig,Apache Pig,输入: 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(拉丁语)进行此操

输入:

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(拉丁语)进行此操作?

当您计算
col1
中每个键的记录数时,应同时计算
真值的数目。这样,整个过程都发生在一个MapReduce作业中

grouped = group INPUT by col1
OUTPUT = foreach grouped generate group, COUNT(INPUT), (double)SUM(INPUT.col2)/COUNT(INPUT);
我在一个遗留系统上使用Pig 0.9,因此我不熟悉新的布尔类型。如果可以对布尔值求和,那么这就足够了。否则,您需要先用一个简单的
foreach
/
generate
将布尔值转换为1和0。

在Pig 0.10 SUM(INPUT.col2)中不起作用,转换为布尔值是不可能的,因为它将INPUT.col2视为布尔值包,而bag不是原始类型。另一件事是,如果将col2的输入数据指定为布尔值,则输入的dump没有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)

我首先得到总计数,然后过滤为True,然后按col1合并。但我不确定这样做是否正确。我有一个类似的解决方案