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
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