conteggio di base è fatto come lo afferma in altre risposte, e nella documentazione maiale:
logs = LOAD 'log';
all_logs_in_a_bag = GROUP logs ALL;
log_count = FOREACH all_logs_in_a_bag GENERATE COUNT(logs);
dump log_count
Hai ragione che il conteggio è inefficiente, anche quando si utilizza COUNT incorporato di maiale, perché questo sarà u se un riduttore. Tuttavia, oggi ho avuto una rivelazione che uno dei modi per accelerarlo sarebbe ridurre l'utilizzo della RAM della relazione che stiamo contando.
In altre parole, quando si conta una relazione, non ci interessa realmente i dati stessi, quindi usiamo la quantità di RAM minima possibile. Sei stato sulla strada giusta con la tua prima iterazione dello script di conteggio.
logs = LOAD 'log'
ones = FOREACH logs GENERATE 1 AS one:int;
counter_group = GROUP ones ALL;
log_count = FOREACH counter_group GENERATE COUNT(ones);
dump log_count
Questo funzionerà su relazioni molto più grandi rispetto allo script precedente e dovrebbe essere molto più veloce. La principale differenza tra questo e il tuo script originale è che non abbiamo bisogno di sommare nulla.
è possibile contare il numero di righe in un alias senza prima raggruppamento? – zzz
Stessa domanda. Ho letto che 'GROUP x ALL' costringerà una serializzazione nella pipeline con il conseguente possibile rallentamento. È corretto? –
Devi raggruppare prima del conteggio. Secondo http://pig.apache.org/docs/r0.15.0/func.html#count: "COUNT richiede un'istruzione GROUP ALL precedente per i conteggi globali e un'istruzione GROUP BY per i conteggi di gruppo." –