Pergunta

Suponha que eu tenho o seguinte entrada na Pig:

some

E eu gostaria de converter isso em:

s
so
som
some

Eu (ainda) não encontrou uma maneira de interagir sobre um chararray no latino de porco. Eu encontrei a função tokenize mas que se divide em boundries palavra. Então pode "latino de porco" fazer isso ou isso é algo que requer uma classe Java para fazer isso?

Foi útil?

Solução

Niels, Tokenizar leva um argumento delimitador, para que você possa torná-lo dividir cada letra; porém eu não consigo pensar em uma maneira de fazê-la produzir sobreposição tokens.

É bastante simples para escrever um UDF no porco, no entanto. Você acabou de implementar uma interface simples chamado EvalFunc (detalhes aqui: http://wiki.apache.org/pig/UDFManual ). Porco foi construído em torno da idéia de usuários escrever suas próprias funções para processar mais nada, e escrever o seu próprio UDF é, portanto, uma comum e coisa natural a fazer.

Uma opção ainda mais fácil, embora não tão eficiente, é usar Pig streaming para transmitir seus dados através de um script (acho chicotadas até um rápido script Perl ou Python para ser mais rápido do que implementar classes Java para one-off empregos). Há um exemplo disto aqui: http: //www.cloudera.com/blog/2009/06/17/analyzing-apache-logs-with-pig/ - que demonstra o uso de uma biblioteca pré-existente, um script Perl, a UDF, e até mesmo um script awk on-the-fly.

Outras dicas

Aqui está como você pode fazê-lo com porco de streaming e python sem escrever UDFs personalizados:

Suponha que seus dados é apenas uma coluna de palavras. O script python (vamos chamá-lo wordSeq.py) para coisas processo seria:

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

Em seguida, no seu script de porco, você diz porco você estiver usando streaming com o script acima e que você quer enviar seu script, se necessário:

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

Use a biblioteca piggybank.

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

Use como esta:

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

OUTPUT = FOREACH INPUT GENERATE SUBSTRING((chararray)$0, 0, 10);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top