我现在正在学习如何使用Hadoop Pig。
如果我有这样的输入文件:
a,b,c,true
s,c,v,false
a,s,b,true
...
最后一个字段是我需要数的字段。。。所以我想知道这个文件中有多少个"true"one_answers"false"。
我尝试:
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:36677〔main〕错误org.apache.pig.tools.grunt.grunt-错误1070:无法使用导入解析计数:[,org.apache.pig.builtin.,org.apache.big.impl.builting.]日志文件中的详细信息:/etc/pig/pig_1375911119028.log
有人能告诉我问题出在哪里吗?
两件事。首先,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) ;
所以现在DUMP
对counts
的输出看起来像:
(true, 2)
(false, 1)
如果你想在它们自己的关系中得到true和false的计数,那么你可以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) ;