Domanda

Supponiamo di avere il seguente input in Pig:

some

E vorrei convertirlo in:

s
so
som
some

Non ho (ancora) trovato il modo di iterare su un chararray in latino latino. Ho trovato la funzione TOKENIZE ma che si divide sui limiti delle parole. Quindi è possibile "suino latino" fare questo o è qualcosa che richiede una classe Java per farlo?

È stato utile?

Soluzione

Niels, TOKENIZE accetta un argomento delimitatore, quindi puoi farlo dividere ogni lettera; tuttavia non riesco a pensare a un modo per farlo produrre token sovrapposti .

È abbastanza semplice scrivere un UDF in Pig, però. Devi solo implementare una semplice interfaccia chiamata EvalFunc (dettagli qui: http://wiki.apache.org/pig/UDFManual ). Pig è stato costruito attorno all'idea che gli utenti scrivessero le proprie funzioni per elaborare quasi tutto, e quindi scrivere il proprio UDF è una cosa comune e naturale da fare.

Un'opzione ancora più semplice, sebbene non altrettanto efficiente, è quella di utilizzare lo streaming Pig per passare i dati attraverso uno script (trovo che montare uno script Perl o Python veloce sia più veloce dell'implementazione di classi Java per lavori una tantum). C'è un esempio di questo qui: http: //www.cloudera.com/blog/2009/06/17/analyzing-apache-logs-with-pig/ - dimostra l'uso di una libreria preesistente, uno script Perl, un UDF, e persino uno script awk al volo.

Altri suggerimenti

Ecco come potresti farlo con pig streaming e python senza scrivere UDF personalizzati:

Supponi che i tuoi dati siano solo 1 colonna di parole. Lo script python (chiamiamolo wordSeq.py) per elaborare le cose sarebbe:

#!/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')

Quindi, nello script del tuo maiale, dici a maiale che stai usando lo streaming con lo script sopra e che vuoi spedire il tuo script come necessario:

-- wordSplitter.pig ---
DEFINE CMD `wordSeq.py` ship('wordSeq.py');
W0 = LOAD 'words';
W = STREAM W0 THROUGH CMD as (word: chararray);

Utilizza la libreria salvadanaio.

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

Usa in questo modo:

REGISTER /path/to/piggybank.jar;
DEFINE SUBSTRING org.apache.pig.piggybank.evaluation.string.SUBSTRING();

OUTPUT = FOREACH INPUT GENERATE SUBSTRING((chararray)<*>, 0, 10);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top