2013-08-07 11 views
6

Sto imparando come usare Hadoop Pig ora.Hadoop Numero conteggio dei maiali

Se ho un file di input come questo:

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

L'ultimo campo è quello che ho bisogno di contare ... Quindi voglio sapere quanti 'vero' e 'falso' in questo file .

cerco:

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

Ora mi si blocca. Voglio usare:

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

Per ottenere il numero di "vero" ma ho sempre l'errore:

2013-08-07 16:32:36,677 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1070: Could not resolve count using imports: [, org.apache.pig.builtin., org.apache.pig.impl.builtin.] Details at logfile: /etc/pig/pig_1375911119028.log

Qualcuno può dirmi dove è il problema?

risposta

10

Due cose. Innanzitutto, count dovrebbe essere in realtà COUNT. Nel maiale, tutte le funzioni incorporate dovrebbero essere chiamate con maiuscole.

secondo luogo, COUNT conta il numero di valori in un sacchetto, non per un valore. Pertanto, si dovrebbe gruppo dal vero/falso, quindi COUNT:

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

Così ora l'uscita di un DUMP per counts avrà un aspetto simile:

(true, 2) 
(false, 1) 

Se si desidera che i conti di vero e falso nelle loro relazioni quindi è possibile FILTER l'output di counts. Tuttavia, probabilmente sarebbe meglio SPLITboolean, poi fare due conteggi separati:

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) ; 
+0

Grazie, funziona! – user2597504