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?

¿Fue útil?

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.

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

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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top