Номер подсчета свиней Hadoop

Теперь я учусь использовать Hadoop Pig.

Если у меня есть такой входной файл:

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

последнее поле-это то, которое мне нужно сосчитать... Поэтому я хочу знать, сколько "true" и "false" в этом файле.

Я:

records = LOAD 'test/input.csv' USING PigStorage(',');
boolean = foreach records generate ;
groups = group boolean all;
Я застревает. Я хочу использовать:
count = foreach groups generate count('true');" 

получить номер "true", но я всегда получаю ошибку:

2013-08-07 16:32:36,677 [main] ошибка орг.апаш.свинья.инструменты.хмыкнуть.Хмыкнуть - Ошибка 1070: не удалось разрешить счетчик с помощью импорта: [, org.апаш.свинья.встроенный., орг.апаш.свинья.impl.встроенный.] Подробности в файле журнала:/etc/pig / pig_1375911119028.log

может кто-нибудь сказать мне, где проблема?

1 ответов


две вещи. Во-первых, count на самом деле должно быть COUNT. В pig все встроенные функции должны вызываться с помощью all-caps.

во-вторых, COUNT подсчитывает количество значений в сумке, а не на стоимость. Поэтому вы должны группировать по true / false, затем COUNT:

boolean = FOREACH records GENERATE  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  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) ;