Frage

Angenommen ich die folgende Eingabe in Pig haben:

some

Und ich möchte, dass die Umwandlung in:

s
so
som
some

Ich habe (noch) nicht einen Weg gefunden, lateinisch einen chararray in Schwein iterieren. Ich habe die Funktion tokenize fand aber, dass spaltet auf Wort boundries. So kann „Schwein-Latein“ tut dies oder ist dies etwas, das eine Java-Klasse erfordert, das zu tun?

War es hilfreich?

Lösung

Niels, Tokenize nimmt ein Trennzeichen Argument, so können Sie es jeden Buchstaben geteilt machen; aber ich kann nicht einen Weg finden, um es produzieren überlappende Token.

Es ist ziemlich einfach, eine UDF in Pig zu schreiben, though. Sie implementieren nur eine einfache Schnittstelle namens EvalFunc (Details hier: http://wiki.apache.org/pig/UDFManual ). Schwein wurde um die Idee, gebaut von Benutzern, ihre eigenen Funktionen schreiben können fast alles zu verarbeiten, und das Schreiben eigenes UDF ist daher eine gemeinsame und natürliche Sache zu tun.

Eine noch einfachere Option, wenn auch nicht so effizient ist Pig-Streaming zu verwenden, um Ihre Daten über ein Skript übergeben (finde ich peitsche ein schnelle Perl oder Python-Skript schneller zu sein als für Java-Klassen Umsetzung Einmal Jobs). Es ist ein Beispiel für diese hier: http: //www.cloudera.com/blog/2009/06/17/analyzing-apache-logs-with-pig/ - es zeigt die Verwendung einer bereits vorhandenen Bibliothek, ein Perl-Skript, eine UDF, und sogar ein on-the-fly awk-Skript.

Andere Tipps

Hier ist, wie Sie es mit Schwein Streaming tun könnten und Python ohne individuelle benutzerdefinierte Funktionen schreiben:

Nehmen wir Ihre Daten nur 1 Spalte von Wörtern ist. Der Python-Skript (läßt es wordSeq.py nennen) Dinge zu verarbeiten wäre:

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

Dann in Ihrem Schwein Skript, sagen Sie Schwein Sie verwenden mit dem obigen Skript Streaming und dass Sie Ihr Skript versenden, wie notwendig:

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

Mit der Sparschwein Bibliothek.

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

Verwenden Sie wie folgt aus:

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

OUTPUT = FOREACH INPUT GENERATE SUBSTRING((chararray)$0, 0, 10);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top