conteo básico se hace como se ha dicho en otras respuestas, y en la documentación de cerdo:
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
Tienes razón en que el recuento es ineficiente, incluso cuando se utiliza COUNT orden interna de cerdo, ya que esto u se un reductor Sin embargo, hoy tuve la revelación de que una de las formas de acelerarlo sería reducir la utilización de RAM de la relación que estamos contando.
En otras palabras, al contar una relación, en realidad no nos importan los datos en sí, así que usemos la menor cantidad de RAM posible. Estabas en el camino correcto con tu primera iteración del script de conteo.
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
Esto funcionará en relaciones mucho más grandes que el script anterior y debería ser mucho más rápido. La principal diferencia entre esto y su script original es que no necesitamos sumar nada.
¿Es posible contar el número de filas en un alias sin antes agrupación? – zzz
La misma pregunta. Leí que 'GROUP x ALL' forzará una serialización en la tubería con la consiguiente desaceleración posible. ¿Es eso correcto? –
Tienes que agrupar antes de contar. De acuerdo con http://pig.apache.org/docs/r0.15.0/func.html#count: "COUNT requiere una declaración anterior GROUP ALL para conteos globales y una declaración GROUP BY para conteos grupales". –