2012-07-18 14 views
9

Estoy usando PigLatin para filtrar algunos registros.Eliminando duplicados usando PigLatin

User1 8 NYC 
User1 9 NYC 
User1 7 LA 
User2 4 NYC 
User2 3 DC 

La secuencia de comandos debe eliminar el duplicado para los usuarios y mantener uno de estos registros. Algo así como el comando único en Linux.

La salida debe ser:

User1 8 NYC 
User2 4 NYC 

¿Alguna sugerencia?

Respuesta

20

Para su ejemplo particular distinta no va a funcionar así como su salida contiene todas las columnas de entrada ($0, $1, $2), puede hacer distintas sólo en una proyección que tiene columnas ($0, $2) o ($0) y perder $1.

Para seleccionar un registro por usuario (cualquier registro) puede usar un GROUP BY y un FOREACH anidado con LIMIT. Ej:

inpt = load '......' ......; 
user_grp = GROUP inpt BY $0; 
filtered = FOREACH user_grp { 
     top_rec = LIMIT inpt 1; 
     GENERATE FLATTEN(top_rec); 
}; 

Este enfoque le ayudará a obtener los registros que son únicas en un subconjunto de campos y también limitar el número de registros de salida por cada usuario, que se puede controlar.

+0

Gracias, eso es exactamente lo que estaba buscando. – aalsum

0

Cerdo proporcionar comando DISTINCT para seleccionar datos únicos. Si desea usar distinct en los campos Use Distinct en el bloque anidado foreach.

+0

Tenga cuidado al utilizar Distinct .. El inconveniente con la palabra clave DISTINCT es: No puede estar seguro de que solo se eliminará el primer registro. –

Cuestiones relacionadas