5 Stimmen

Aufteilung der Eingabe in Teilstrings in PIG (Hadoop)

Angenommen, ich habe die folgende Eingabe in Pig:

some

Und das würde ich gerne umwandeln in:

s
so
som
some

Ich habe (noch) keine Möglichkeit gefunden, über ein Chararray in Schweinelatein zu iterieren. Ich habe die TOKENIZE-Funktion gefunden, aber die teilt sich an Wortgrenzen. Also kann "Schweinelatein" dies tun, oder ist dies etwas, das eine Java-Klasse zu tun, erfordert?

6voto

SquareCog Punkte 19031

Niels, TOKENIZE nimmt ein Trennzeichen-Argument entgegen, so dass man es dazu bringen kann, jeden Buchstaben aufzuteilen; allerdings fällt mir kein Weg ein, wie man es dazu bringen kann, Überschneidungen Spielsteine.

Es ist jedoch ziemlich einfach, eine UDF in Pig zu schreiben. Sie implementieren einfach eine einfache Schnittstelle namens EvalFunc (Details hier: http://wiki.apache.org/pig/UDFManual ). Pig wurde auf der Grundlage der Idee entwickelt, dass Benutzer ihre eigenen Funktionen schreiben können, um fast alles zu verarbeiten, und das Schreiben eigener UDFs ist daher eine übliche und natürliche Vorgehensweise.

Eine noch einfachere, wenn auch nicht so effiziente Möglichkeit ist die Verwendung von Pig-Streaming, um Ihre Daten durch ein Skript zu leiten (ich finde, dass die Erstellung eines schnellen Perl- oder Python-Skripts schneller ist als die Implementierung von Java-Klassen für einmalige Aufgaben). Ein Beispiel dafür gibt es hier: http://www.cloudera.com/blog/2009/06/17/analyzing-apache-logs-with-pig/ -- Es demonstriert die Verwendung einer bereits existierenden Bibliothek, eines Perl-Skripts, einer UDF und sogar eines fliegenden awk-Skripts.

6voto

eytan Punkte 5815

Hier sehen Sie, wie Sie das mit Pig Streaming und Python machen können, ohne eigene UDFs zu schreiben:

Angenommen, Ihre Daten bestehen nur aus einer Spalte mit Wörtern. Das Python-Skript (nennen wir es wordSeq.py) zur Verarbeitung der Daten würde wie folgt aussehen:

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

In Ihrem Schweineskript teilen Sie dem Schwein dann mit, dass Sie Streaming mit dem obigen Skript verwenden und dass Sie Ihr Skript bei Bedarf versenden möchten:

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

5voto

Morgan Christiansson Punkte 28762

Verwenden Sie die Sparschwein-Bibliothek.

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

So verwenden:

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

OUTPUT = FOREACH INPUT GENERATE SUBSTRING((chararray)$0, 0, 10);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X