2017-09-07 10 views
0

Entrée:Comment lire une liste de valeurs dans Pig comme un sac et le comparer à une valeur spécifique?

ids:

1111,2222,3333,4444 

employé:

{"name":"abc","id":"1111"} {"name":"xyz","id":"10"} 
{"name":"z","id":"100"} {"name":"m","id":"99"} 
{"name":"pqr","id":"3333"} 

Je veux filtrer les employés dont l'ID existe dans la liste donnée.

Résultats escomptés:

{"name":"xyz","id":"10"} {"name":"z","id":"100"} 
{"name":"m","id":"99"} 

code existant:

idList = LOAD 'pathToFile' USING PigStorage(',') AS (id:chararray); 
empl = LOAD 'pathToFile' USING com.twitter.elephantbird.pig.load.JsonLoader('-nestedLoad') AS (data:map[]); 
output = FILTER empl BY data#'id' in (idList); 
-- not working, states: A column needs to be projected from a relation for it to be used as a scalar 
output = FILTER empl BY data#'id' in (idList#id); 
-- not working, states: mismatched input 'id' expecting set null 

Répondre

0

JsonLoad() est natif dans pig > 0.10, et vous pouvez spécifier le schéma:

empl = LOAD 'pathToFile' USING JsonLoader('name:chararray, id:chararray'); 
DUMP empl; 

(abc,1111) 
(xyz,10) 
(z,100) 
(m,99) 
(pqr,3333) 

Vous chargez idList en tant que table à une colonne de type chararray mais vous souhaitez une liste.

Chargement comme une table d'une colonne (implique une modification que vous produisez donc il n'y a qu'un seul enregistrement par ligne):

idList = LOAD 'pathToFile' USING PigStorage(',') AS (id:chararray); 
DUMP idList; 

(1111) 
(2222) 
(3333) 
(4444) 

ou un fichier d'une ligne, nous allons changer le séparateur donc il doesn « t divisé en colonnes (sinon elle conduira à une charge seule la première colonne):

idList = LOAD 'pathToFile' USING PigStorage(' ') AS (id:chararray); 
idList = FOREACH idList GENERATE FLATTEN(TOKENIZE(id, '[,]')) AS id; 
DUMP idList; 

(1111) 
(2222) 
(3333) 
(4444) 

maintenant, nous pouvons faire un LEFT JOIN pour voir qui id ne sont pas présents dans idList puis un FILTER pour ne garder que ceux-ci. output est un mot-clé réservé, vous ne devez pas l'utiliser:

res = JOIN empl BY id LEFT, idList BY id; 
res = FILTER res BY idList::id IS NULL; 
DUMP res; 

(xyz,10,) 
(m,99,) 
(z,100,)