Come posso caricare un file in un DataBag dall'interno di un Yahoo PigLatin UDF?

StackOverflow https://stackoverflow.com/questions/2721902

  •  01-10-2019
  •  | 
  •  

Domanda

Ho un programma di maiale dove sto cercando di calcolare il centro minimo tra due sacchetti. Al fine di farlo funzionare, ho trovato ho bisogno di COGROUP le borse in un unico set di dati. L'intera operazione richiede molto tempo. Voglio uno dei due aperti delle borse dal disco all'interno della UDF, o per essere in grado di passare un'altra relazione nella UDF senza bisogno di COGROUP ......

Codice:

# **** 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;

in fondo il mio problema è che per ogni brevetto ho bisogno di passare i rapporti sub (wordcounts, kcenters). Per fare questo, faccio una croce e poi un COGROUP da PatentNumber al fine di ottenere il PatentNumber set, {wordcounts}, {} kcenters. Se riuscivo a capire un modo per passare una relazione o di aprire i centri dall'interno della UDF, quindi ho potuto solo wordcounts GROUP BY PatentNumber e myudfs.kmeans run (numero di parole) che è molto più veloce si spera senza la croce / COGROUP.

Questa è un'operazione costosa. Attualmente questo dura circa 20 minuti e sembra virare la CPU / RAM. Stavo pensando che potrebbe essere più efficiente senza la croce. Io non sono sicuro che sarà più veloce, quindi mi piacerebbe sperimentare.

In ogni caso sembra che chiamare le funzioni di carico dall'interno di maiale ha bisogno di un oggetto PigContext che non ottengo da un evalfunc. E per utilizzare il file system Hadoop, ho bisogno di alcuni oggetti iniziali pure, che non vedo come ottenere. Quindi la mia domanda è come posso aprire un file dal file system Hadoop all'interno di un PIG UDF? Ho anche eseguito l'UDF via principale per il debug. Così ho bisogno di caricare dal filesystem normale quando in modalità debug.

Un'altra idea migliore sarebbe se ci fosse un modo per passare una relazione in un UDF senza bisogno di CROSS / COGROUP. Questo sarebbe l'ideale, soprattutto se risiede relazione in memoria .. cioè essere in grado di fare myudfs.kmeans (wordcounts, kcenters) senza bisogno del CROSS / COGROUP con kcenters ...

Ma l'idea di base è quello di commercio IO per i cicli di RAM / CPU.

In ogni caso qualsiasi aiuto sarà molto apprezzato, le UDF di suini sono non super ben documentati al di là delle maggior parte delle più semplici, anche nel manuale UDF.

È stato utile?

Soluzione

Cervo, C'è un UDF nel salvadanaio che fa più o meno quello che vuoi, chiamati LookupInFiles. Scopri il codice sorgente, dovrebbe essere abbastanza semplice per convertire le vostre esigenze.

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

Si prega di inviare la lista se avete altri problemi, suggerimenti documentazione, ecc.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top