2017-06-13 3 views
1

Dans Apache Pig (version 0.16.x), quelles sont les méthodes les plus efficaces pour filtrer un ensemble de données par une liste de valeurs existante pour l'un des champs de l'ensemble de données?Pig: filtrage efficace par liste chargée

Par exemple, (mise à jour par la pointe de @ inquisitive_mind)

entrée: un fichier séparé de ligne avec une valeur par ligne my_codes.txt

'110' 
'100' 
'000' 

sample_data.txt

'110', 2 
'110', 3 
'001', 3 
'000', 1 

Sortie souhaitée

'110', 2 
'110', 3 
'000', 1 

Exemple de script

%default my_codes_file 'my_codes.txt' 
%default sample_data_file 'sample_data.txt' 
my_codes = LOAD '$my_codes_file' as (code:chararray) 
sample_data = LOAD '$sample_data_file' as (code: chararray, point: float) 
desired_data = FILTER sample_data BY code IN (my_codes.code); 

Erreur:

Scalar has more than one row in the output. 1st : ('110'), 2nd :('100') 
(common cause: "JOIN" then "FOREACH ... GENERATE foo.bar" should be "foo::bar") 

J'avais aussi essayé FILTER sample_data BY code IN my_codes; mais la clause "IN" semble exiger entre parenthèses. J'ai aussi essayé FILTER sample_data BY code IN (my_codes); mais nous avons eu l'erreur: Une colonne doit être projetée à partir d'un rapport pour être utilisé comme

+0

suivi: Si la liste existante est petite comparaison avec l'ensemble de données interrogé, une jointure * répliquée * dans Pig est plus efficace qu'une jointure standard. – Quetzalcoatl

Répondre

1

scalaire Le fichier a my_codes.txt les codes comme ligne au lieu d'une colonne. Puisque vous le charger dans un seul champ les codes devraient être comme ça ci-dessous

'110' 
'100' 
'000' 

vous pouvez également utiliser JOIN

joined_data = JOIN sample_date BY code,my_codes BY code; 
desired_data = FOREACH joined_data GENERATE $0,$1; 
+0

De plus, il semble préférable de préférer Filtrer à Join, mais ils peuvent être tout aussi intensifs dans ce cas (par exemple, si my_codex.txt contient 1 milliard d'enregistrements)? – Quetzalcoatl

+0

Oui, le filtre est favorable.Je doute que "IN" fonctionnerait car dans les versions antérieures de PIG, vous deviez spécifier explicitement les valeurs séparées par une virgule et placées entre parenthèses. –

+0

Correct. Même avec les versions ultérieures qui l'ont, "IN" ne semble pas pratique si my_codes> 1000 valeurs. Par conséquent, votre solution JOIN semble la meilleure – Quetzalcoatl