División de entrada en subcadenas en PIG (Hadoop)
-
05-07-2019 - |
Pregunta
Supongamos que tengo la siguiente entrada en Pig:
some
Y me gustaría convertir eso en:
s
so
som
some
No he encontrado (todavía) una forma de iterar sobre un chararray en latín de cerdo. He encontrado la función TOKENIZE pero que se divide en límites de palabras. Así que puede " cerdo latino " haz esto o esto es algo que requiere una clase de Java para hacer eso?
Solución
Niels, TOKENIZE toma un argumento delimitador, por lo que puede dividir cada letra; sin embargo, no se me ocurre una manera de hacer que produzca 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 creó alrededor de la idea de que los usuarios escriban sus propias funciones para procesar casi cualquier cosa, y escribir su propio UDF es, por lo tanto, algo común y natural.
Una opción aún más fácil, aunque no es tan eficiente, es utilizar la transmisión por secuencias de Pig para pasar sus datos a través de un script (me parece que preparar un script rápido de Perl o Python es más rápido que implementar clases de Java para trabajos únicos). Aquí hay un ejemplo de esto: http: //www.cloudera.com/blog/2009/06/17/analyzing-apache-logs-with-pig/ : demuestra el uso de una biblioteca preexistente, un script Perl, un UDF, e incluso un script awk sobre la marcha.
Otros consejos
Aquí es cómo podría hacerlo con pig streaming y python sin escribir UDF personalizados:
Supongamos que sus datos son solo 1 columna de palabras. El script de Python (llamémoslo 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 pig que está utilizando la transmisión con el script anterior y que desea enviar su script según sea necesario:
-- wordSplitter.pig ---
DEFINE CMD `wordSeq.py` ship('wordSeq.py');
W0 = LOAD 'words';
W = STREAM W0 THROUGH CMD as (word: chararray);
Usa la biblioteca de piggybank.
Utilice de esta forma:
REGISTER /path/to/piggybank.jar;
DEFINE SUBSTRING org.apache.pig.piggybank.evaluation.string.SUBSTRING();
OUTPUT = FOREACH INPUT GENERATE SUBSTRING((chararray)<*>, 0, 10);