6

我现在正在学习如何使用 Hadoop Pig。

如果我有这样的输入文件:

a,b,c,true
s,c,v,false
a,s,b,true
...

最后一个字段是我需要计算的...所以我想知道这个文件中有多少“真”和“假”。

我尝试:

records = LOAD 'test/input.csv' USING PigStorage(',');
boolean = foreach records generate $3;
groups = group boolean all;

现在我卡住了。我想使用:

count = foreach groups generate count('true');" 

要获得“真”的数量,但我总是得到错误:

2013-08-07 16:32:36,677 [main] 错误 org.apache.pig.tools.grunt.Grunt - 错误 1070:无法使用导入解析计数:[,org.apache.pig.builtin.,org.apache .pig.impl.builtin.] 日志文件中的详细信息:/etc/pig/pig_1375911119028.log

谁能告诉我问题出在哪里?

4

1 回答 1

11

两件事情。首先,count实际上应该是COUNT。在 pig 中,所有内置函数都应该用全大写来调用。

其次,COUNT计算一个包中的值的数量,而不是一个值。因此,您应该按真/假分组,然后COUNT

boolean = FOREACH records GENERATE $3 AS trueORfalse ;
groups = GROUP boolean BY trueORfalse ;
counts = FOREACH groups GENERATE group AS trueORfalse, COUNT(boolean) ;

所以现在DUMPfor的输出counts看起来像:

(true, 2)
(false, 1)

如果你想在他们自己的关系中计算真假,那么你可以FILTER输出counts. 但是,最好先做两个单独的计数:SPLIT boolean

boolean = FOREACH records GENERATE $3 AS trueORfalse ;
SPLIT boolean INTO alltrue IF trueORfalse == 'true', 
                   allfalse IF trueORfalse == 'false' ;

tcount = FOREACH (GROUP alltrue ALL) GENERATE COUNT(alltrue) ;
fcount = FOREACH (GROUP allfalse ALL) GENERATE COUNT(allfalse) ;
于 2013-08-07T23:11:59.477 回答