spark - map reduce hadoop
DivisiĆ³n de entrada en subcadenas en PIG(Hadoop) (3)
Aquí es cómo puede hacerlo con Pig Streaming y Python sin escribir UDF personalizadas:
Supongamos que sus datos son solo 1 columna de palabras. El script de Python (vamos a llamarlo wordSeq.py) para procesar cosas sería:
#!/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'')
Luego, en su script de cerdo, le dice a cerdito que está utilizando la transmisión con el script anterior y que desea enviar su secuencia de comandos según sea necesario:
-- wordSplitter.pig ---
DEFINE CMD `wordSeq.py` ship(''wordSeq.py'');
W0 = LOAD ''words'';
W = STREAM W0 THROUGH CMD as (word: chararray);
Supongamos que tengo la siguiente entrada en Pig:
some
Y me gustaría convertir eso en:
s
so
som
some
Todavía no he encontrado una manera de iterar sobre una chararray en pig latin. He encontrado la función TOKENIZE, pero eso se divide en límites de palabras. Entonces, ¿puede "cerdo latino" hacer esto o es algo que requiere una clase de Java para hacer eso?
Niels, TOKENIZE toma un argumento de delimitador, por lo que puedes dividir cada letra; sin embargo, no puedo pensar en una forma de hacerlo producir tokens superpuestos .
Sin embargo, es bastante sencillo escribir un UDF en Pig. Simplemente implementa una interfaz simple llamada EvalFunc (detalles aquí: http://wiki.apache.org/pig/UDFManual ). Pig se desarrolló en torno a la idea de que los usuarios escriban sus propias funciones para procesar casi cualquier cosa, y escribir tu propia UDF es, por lo tanto, algo común y natural de hacer.
Una opción aún más fácil, aunque no tan eficiente, es usar Pig Stream para pasar sus datos a través de un script (me parece que acelerar un script rápido de Perl o Python es más rápido que implementar clases Java para trabajos únicos). Hay un ejemplo de esto aquí: http://www.cloudera.com/blog/2009/06/17/analyzing-apache-logs-with-pig/ - demuestra el uso de una biblioteca preexistente, una Perl script, un UDF e incluso un script awk sobre la marcha.
Use la biblioteca piggybank.
Use esto:
REGISTER /path/to/piggybank.jar;
DEFINE SUBSTRING org.apache.pig.piggybank.evaluation.string.SUBSTRING();
OUTPUT = FOREACH INPUT GENERATE SUBSTRING((chararray)$0, 0, 10);