Frage

Ich habe ein Schwein-Programm, wo ich versuche die minimale Mitte zwischen zwei Taschen zu berechnen. Damit es zu arbeiten, fand ich, dass ich die Taschen in einem einzigen Datensatz COGROUP benötigen. Der gesamte Vorgang dauert eine lange Zeit. Ich möchte entweder offen einen der Beutel von der Festplatte in der UDF, oder in der Lage sein eine andere Beziehung in die UDF passieren, ohne zu COGROUP brauchen ......

Code:

# **** Load files for iteration ****
register myudfs.jar;
wordcounts = LOAD 'input/wordcounts.txt' USING PigStorage('\t') AS (PatentNumber:chararray, word:chararray, frequency:double);
centerassignments = load 'input/centerassignments/part-*' USING PigStorage('\t') AS (PatentNumber: chararray, oldCenter: chararray, newCenter: chararray);
kcenters = LOAD 'input/kcenters/part-*' USING PigStorage('\t') AS (CenterID:chararray, word:chararray, frequency:double);
kcentersa1 = CROSS centerassignments, kcenters;
kcentersa = FOREACH kcentersa1 GENERATE centerassignments::PatentNumber as PatentNumber, kcenters::CenterID as CenterID, kcenters::word as word, kcenters::frequency as frequency;

#***** Assign to nearest k-mean *******
assignpre1 = COGROUP wordcounts by PatentNumber, kcentersa by PatentNumber;
assignwork2 = FOREACH assignpre1 GENERATE group as PatentNumber, myudfs.kmeans(wordcounts, kcentersa) as CenterID;

im Grunde mein Problem ist, dass ich für jedes Patent müssen die Unter Beziehungen (wordcounts, kcenters) zu übergeben. Um dies zu tun, muss ich ein Kreuz und dann eine COGROUP von PatentNumber, um den Satz PatentNumber zu bekommen, {wordcounts}, {} kcenters. Wenn ich könnte einen Weg eine Beziehung passieren oder die Zentren innerhalb der UDF öffnen, dann konnte ich nur GROUP wordcounts von PatentNumber und führen myudfs.kmeans (wordcount), die ohne die CROSS / COGROUP hoffentlich viel schneller ist.

Dies ist eine teuere Operation. Derzeit dauert dies etwa 20 Minuten und wird die CPU / RAM heften. Ich dachte, es könnte ohne die CROSS effizienter sein. Ich bin nicht sicher, dass es schneller sein, so würde ich gerne experimentieren.

Auf jeden Fall sieht es aus wie der Aufruf die Laden-Funktionen aus Schwein braucht ein PigContext Objekt, das ich von einem evalfunc nicht bekommen. Und das Hadoop-Dateisystem zu verwenden, muss ich einige erste Objekte als auch, was ich sehe nicht, wie zu bekommen. Also meine Frage ist, wie kann ich eine Datei aus dem Hadoop-Dateisystem innerhalb einer PIG UDF öffnen? Ich betreibe auch die UDF über Haupt für das Debuggen. Also habe ich aus dem normalen Dateisystem, wenn im Debug-Modus zu laden muß.

Eine weitere bessere Idee wäre, wenn es eine Möglichkeit gäbe, eine Beziehung zu einem UDF passieren, ohne zu CROSS / COGROUP zu benötigen. Dies wäre ideal, vor allem, wenn die Beziehung besteht in Erinnerung .. also in der Lage, myudfs.kmeans (wordcounts, kcenters), ohne dass das CROSS / COGROUP mit kcenters ...

zu tun

Aber die Grundidee ist IO für RAM / CPU-Zyklen zu handeln.

Auf jeden Fall wird jede Hilfe sehr geschätzt wird, werden die PIG UDF nicht super weit über die einfachsten diejenigen dokumentiert, auch in dem UDF-Handbuch.

War es hilfreich?

Lösung

Cervo, Es gibt eine UDF im Sparschwein, die mehr oder weniger tun, was Sie wollen, genannt LookupInFiles. Überprüfen Sie den Quellcode aus, sollte es ziemlich einfach sein, auf Ihre Bedürfnisse zu konvertieren.

http://svn.apache.org/viewvc/hadoop/pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation /string/LookupInFiles.java

Bitte senden Sie die Liste, wenn Sie weitere Fragen haben, Dokumentation Anregungen, etc.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top