Fractionnement des entrées en sous-chaînes dans PIG (Hadoop)
-
05-07-2019 - |
Question
Supposons que j'ai l'entrée suivante dans Pig:
some
Et je voudrais convertir cela en:
s
so
som
some
Je n'ai pas (encore) trouvé le moyen de parcourir un personnage de porc latin. J'ai trouvé la fonction TOKENIZE mais elle se divise en plusieurs mots. Alors peut " porc latin " faire ceci ou est-ce quelque chose qui nécessite une classe Java pour le faire?
La solution
Niels, TOKENIZE prend un argument de délimiteur, vous pouvez donc le scinder en chaque lettre. Cependant, je ne vois pas comment le faire produire des chevauchements .
Cependant, écrire un fichier UDF dans Pig est assez simple. Vous venez de mettre en place une interface simple appelée EvalFunc (détails ici: http://wiki.apache.org/pig/UDFManual ). Pig a été conçu autour de l’idée que les utilisateurs écrivent leurs propres fonctions pour traiter la plupart des tâches, et écrire votre propre fichier UDF est donc une chose naturelle et naturelle à faire.
Une option encore plus simple, bien que moins efficace, consiste à utiliser le streaming Pig pour transmettre vos données via un script (je trouve qu'un script Perl ou Python rapide est plus rapide que l'implémentation de classes Java pour des travaux ponctuels). Vous en trouverez un exemple ici: http: //www.cloudera.com/blog/2009/06/17/analyzing-apache-logs-with-pig/ - il illustre l'utilisation d'une bibliothèque préexistante, d'un script Perl, d'un fichier UDF, et même un script awk à la volée.
Autres conseils
Voici comment vous pouvez le faire avec le streaming pig et le python sans écrire de fichiers UDF personnalisés:
Supposons que vos données ne contiennent qu'une colonne de mots. Le script python (appelons-le wordSeq.py) pour traiter les choses serait:
#!/usr/bin/python
### wordSeq.py ### [don't forget to chmod u+x wordSeq.py !]
import sys
for word in sys.stdin:
word = word.rstrip()
sys.stdout.write('\n'.join([word[:i+1] for i in xrange(len(word))]) + '\n')
Ensuite, dans votre script pig, vous indiquez à pig que vous utilisez la diffusion en continu avec le script ci-dessus et que vous souhaitez envoyer votre script au besoin:
-- wordSplitter.pig ---
DEFINE CMD `wordSeq.py` ship('wordSeq.py');
W0 = LOAD 'words';
W = STREAM W0 THROUGH CMD as (word: chararray);
Utilisez la bibliothèque de la tirelire.
Utilisez comme ceci:
REGISTER /path/to/piggybank.jar;
DEFINE SUBSTRING org.apache.pig.piggybank.evaluation.string.SUBSTRING();
OUTPUT = FOREACH INPUT GENERATE SUBSTRING((chararray)<*>, 0, 10);