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?

Était-ce utile?

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.

http://hadoop.apache.org/pig/docs/r0.7.0/api/org/apache/pig/piggybank/evaluation/string/SUBSTRING.html

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top