2011-10-13 6 views
3

Dans PigLatin, je veux extraire les autres champs d'un enregistrement que je veux sélectionner en raison d'un agrégat, tel que MAX.Porc: extraction de champs individuels après un groupe

J'ai des difficultés à expliquer le problème, alors voici un exemple. Disons que je veux saisir le nom de la personne la plus âgée à un ménage:

Relation A est quatre colonnes, (name, address, zipcode, age)

B = GROUP A BY (address, zipcode); # group by the address 

# generate the address, the person's age, but how do I grab that person's name? 
C = FOREACH B GENERATE FLATTEN(group), MAX(age), ??? Name ???; 

Comment générer le nom de la personne avec l'âge MAX?

Répondre

4

Le problème avec votre logique est qu'il peut y avoir plus de 1 personnes avec le MAX (âge). Ensuite, vous devez GROUP BY (nom, adresse, âge). Mais pour vous donner une réponse rapide, j'écrirai qui obtient seulement un des âges maximums. (Je ne suis pas sûr que ce la meilleure façon que)

C = FOREACH B {       
    DA = ORDER A BY age DESC;     
    DB = LIMIT DA 1;       
    GENERATE FLATTEN(group), FLATTEN(DB.age), FLATTEN(DB.name); 
} 
+0

Je peux choisir arbitrairement un en cas d'égalité. Dans mes données réelles, la chose que je prends MAX aura très rarement une cravate. Merci beaucoup pour la réponse. Je vais l'essayer –

+1

vous êtes les bienvenus compagnon, j'espère que cela résoudrait votre problème alors – frail

2

Soyez prudent avec la réponse de santé fragile qui est acceptée, car il aurait un comportement indésirable si le nombre dans la commande LIMIT est supérieur à 1. En particulier, en ce sens Dans le cas contraire, la sortie serait un produit croisé entre tous les âges et noms en raison des deux derniers appels FLATTEN. Ensuite, si la valeur dans la LIMITE est N, il y aurait N^2 lignes de sortie au lieu de N prévu.

Il est beaucoup plus sûr de faire ce qui suit dans la ligne GENERATE, ce qui donnerait exactement le même résultat que le résultat accepté. répondre lorsque 'LIMIT 1' est utilisé:

GENERATE FLATTEN(group) AS (address, zipcode), FLATTEN(DB.(age, name)) AS (age, name); 
Questions connexes