hadoop - spark - PIG cómo contar un número de filas en alias
pig script (7)
Hice algo como esto para contar el número de filas en un alias en PIG:
logs = LOAD ''log''
logs_w_one = foreach logs generate 1 as one;
logs_group = group logs_w_one all;
logs_count = foreach logs_group generate SUM(logs_w_one.one);
dump logs_count;
Esto parece ser demasiado ineficiente. ¡Por favor, ilumíname si hay una mejor manera!
Aquí hay una versión con optimización. Todas las soluciones anteriores requerirían que el cerdo lea y escriba la tupla completa al contar, este script a continuación solo escribe ''1''-s
DEFINE row_count(inBag, name) RETURNS result {
X = FOREACH $inBag generate 1;
$result = FOREACH (GROUP X ALL PARALLEL 1) GENERATE ''$name'', COUNT(X);
};
El uso como
xxx = row_count(rows, ''rows_count'');
Arnon Rotem-Gal-Oz ya respondió esta pregunta hace un tiempo, pero pensé que a algunos les gustaría esta versión un poco más concisa.
LOGS = LOAD ''log'';
LOG_COUNT = FOREACH (GROUP LOGS ALL) GENERATE COUNT(LOGS);
COUNT es parte del cerdo, mira el manual
LOGS= LOAD ''log'';
LOGS_GROUP= GROUP LOGS ALL;
LOG_COUNT = FOREACH LOGS_GROUP GENERATE COUNT(LOGS);
El conteo básico se realiza como se indicó en otras respuestas, y en la documentación del 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
Tiene razón en que el recuento es ineficiente, incluso cuando se usa COUNT incorporado count porque este usará 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.
Lo que quiere es contar todas las líneas en una relación (conjunto de datos en Pig Latin)
Esto es muy fácil siguiendo los siguientes pasos:
logs = LOAD ''log''; --relation called logs, using PigStorage with tab as field delimiter
logs_grouped = GROUP logs ALL;--gives a relation with one row with logs as a bag
number = FOREACH LOGS_GROUP GENERATE COUNT_STAR(logs);--show me the number
Tengo que decir que es importante el punto de Kevin como usar COUNT en lugar de COUNT_STAR, tendríamos solo el número de líneas cuyo primer campo no es nulo.
También me gusta la sintaxis de una línea de Jerome, es más conciso, pero para ser didáctico, prefiero dividirlo en dos y agregar algún comentario.
En general prefiero:
numerito = FOREACH (GROUP CARGADOS3 ALL) GENERATE COUNT_STAR(CARGADOS3);
encima
name = GROUP CARGADOS3 ALL
number = FOREACH name GENERATE COUNT_STAR(CARGADOS3);
Tenga cuidado, con COUNT
su primer artículo en la bolsa no debe ser nulo. De lo contrario, puede usar la función COUNT_STAR
para contar todas las filas.
UTILIZAR COUNT_STAR
LOGS= LOAD ''log'';
LOGS_GROUP= GROUP LOGS ALL;
LOG_COUNT = FOREACH LOGS_GROUP GENERATE COUNT_STAR(LOGS);