2012-03-22 19 views
8

Estoy intentando escribir un script de pig latin para obtener el conteo de un conjunto de datos que he filtrado.No se pudo inferir la función COUNT

Aquí está el guión hasta el momento:

/* scans by title */ 

scans   = LOAD '/hive/scans/*' USING PigStorage(',') AS (thetime:long,product_id:long,lat:double,lon:double,user:chararray,category:chararray,title:chararray); 
productscans = FILTER scans BY (title MATCHES 'proactiv'); 
scancount  = FOREACH productscans GENERATE COUNT($0); 
DUMP scancount; 

Por alguna razón, me sale el error:

Could not infer the matching function for org.apache.pig.builtin.COUNT as multiple or none of them fit. Please use an explicit cast.

¿qué estoy haciendo mal aquí? Supongo que tiene algo que ver con el tipo de campo que estoy pasando, pero parece que no puedo resolverlo.

TIA, Jason

Respuesta

14

Es esto lo que está buscando (grupo de todos para poner todo en una bolsa, y luego contar los artículos):

scans   = LOAD '/hive/scans/*' USING PigStorage(',') AS (thetime:long,product_id:long,lat:double,lon:double,user:chararray,category:chararray,title:chararray); 
productscans = FILTER scans BY (title MATCHES 'proactiv'); 
grouped   = GROUP productscans ALL; 
count   = FOREACH grouped GENERATE COUNT(productscans); 
dump count; 
+2

Eso es todo (menos el" FOREACH g "debería ser" FOREACH agrupado ") - ¡gracias Chris! – JasonA

+0

Editado, gracias por la revisión –

0

Tal

/* scans by title */ 

scans   = LOAD '/hive/scans/*' USING PigStorage(',') AS (thetime:long,product_id:long,lat:double,lon:double,user:chararray,category:chararray,title:chararray); 
productscans = FILTER scans BY (title MATCHES 'proactiv'); 
scancount  = FOREACH productscans GENERATE COUNT(productscans); 
DUMP scancount; 
+0

gracias Jake - por desgracia, no hubo suerte. eso me da: 'Proyección escalar inválida: productscans: una columna necesita ser proyectada desde una relación para ser utilizada como un escalar' – JasonA

4

COUNT requiere una instrucción GROUP ALL anterior para recuentos globales y una instrucción GROUP BY para recuentos de grupos.

Puede utilizar cualquiera de abajo:

scans   = LOAD '/hive/scans/*' USING PigStorage(',') AS (thetime:long,product_id:long,lat:double,lon:double,user:chararray,category:chararray,title:chararray); 
productscans = FILTER scans BY (title MATCHES 'proactiv'); 
grouped   = GROUP productscans ALL; 
count   = FOREACH grouped GENERATE COUNT(productscans); 
DUMP scancount; 

O

scans   = LOAD '/hive/scans/*' USING PigStorage(',') AS (thetime:long,product_id:long,lat:double,lon:double,user:chararray,category:chararray,title:chararray); 
productscans = FILTER scans BY (title MATCHES 'proactiv'); 
grouped   = GROUP productscans ALL; 
count   = FOREACH grouped GENERATE COUNT($1); 
DUMP scancount; 
Cuestiones relacionadas