join - tutorial - Pig Script: Joignez-vous à plusieurs fichiers



pig script example (1)

Pig 0.10 introduit l'intégration avec Bloom Filters http://search-hadoop.com/c/Pig:/src/org/apache/pig/builtin/Bloom.java%7C%7C+%2522done+%2522exec+Tuple%2522

Vous pouvez former un filtre de bloom sur les 3 fichiers plus petits et filtrer le gros fichier, avec un peu de chance, il en résultera un fichier plus petit. Après cela, effectuez des jointures standard pour obtenir une précision de 100%.

MISE À JOUR 1 Vous auriez besoin de former 2 filtres Bloom, un pour chacune des petites tables, au fur et à mesure que vous vous joindrez à différentes clés.

UPDATE 2 Il a été mentionné dans les commentaires que la jointure externe est utilisée pour augmenter les données. Dans ce cas, les filtres Bloom ne sont peut-être pas les meilleurs, ils sont bons pour filtrer et ne pas ajouter de données dans les jointures externes, car vous souhaitez conserver les données non-appariées. Une meilleure approche serait de partitionner toutes les petites tables sur les champs respectifs (f1, f2, f3, f4), de stocker chaque partition dans un fichier séparé assez petit pour charger en mémoire. Que le groupe BY table massive sur f1, f2, f3, f4 et dans un FOREACH passer le groupe (f1, f2, f3, f4) avec sac associé à la fonction personnalisée écrite en Java, qui charge les partitions respectives des petits fichiers dans RAM et effectue une augmentation.

Je suis en train de lire un gros fichier (plus d'un milliard d'enregistrements) et de le joindre à trois autres fichiers, je me demandais si le processus pouvait être rendu plus efficace pour éviter de multiples lectures sur la grande table. Mémoire.

A = join smalltable1 by  (f1,f2) RIGHT OUTER,massive by (f1,f2) ;
B = join smalltable2 by  (f3) RIGHT OUTER, A by (f3) ;
C = join smalltable3 by  (f4) ,B by (f4) ;

L'alternative que je pensais est d'écrire un udf et de remplacer les valeurs dans une lecture, mais je ne suis pas sûr si un udf serait efficace puisque les petits fichiers ne rentreront pas dans la mémoire. La mise en œuvre pourrait être comme:

A = LOAD massive 
B = generate f1,udfToTranslateF1(f1),f2,udfToTranslateF2(f2),f3,udfToTranslateF3(f3)

Appréciez vos pensées ...