2012-10-31 2 views
6

Sono relativamente nuovo per PigScript. Vorrei sapere se esiste un modo per passare i parametri alle UDF Java in Pig?Posso passare i parametri alle UDF nello script Pig?

Ecco lo scenario: Ho un file di registro con colonne diverse (ciascuna rappresenta una chiave primaria in un'altra tabella). Il mio compito è di ottenere il conteggio dei valori distinti della chiave primaria nella colonna selezionata. Ho scritto uno script Pig che fa il lavoro di ottenere le chiavi primarie distinte e contarle. Tuttavia, ora dovrei scrivere una nuova UDF per ogni colonna. C'è un modo migliore per farlo? Come se potessi passare un numero di riga come parametro a UDF, evita la necessità che scriva più UDF.

risposta

0

Sì, si può passare qualsiasi parametro nel parametro tupla ingresso del vostro UDF:

exec(Tuple input) 

e accedervi utilizzando

input.get(index) 
+0

Sì Fred. Ma come posso passare un parametro dal lato PigScript? – emkay

+0

Non so se sia esatto quello che vuoi fare ma potresti creare una nuova Tupla con la chiave primaria come primo campo e i dati che vuoi effettivamente passare alla tua UDF come i campi rimanenti: 'FOREACH tupleForUdf GENERATE primarykey, *; ' – Frederic

3

Il modo per farlo è quello di utilizzare DEFINE e il costruttore dell'UDF. Quindi ecco un esempio di uno "splitter" cliente:

REGISTER com.sample.MyUDFs.jar; 
DEFINE CommaSplitter com.sample.MySplitter(','); 

B = FOREACH A GENERATE f1, CommaSplitter(f2); 

Speriamo che trasmetta l'idea.

1

per passare i parametri di effettuare le seguenti nel vostro pigscript:

UDF(document, '$param1', '$param2', '$param3') 

edit: Non sono sicuro se questi params devono essere wrappedin '' o no

mentre nella vostra UDF voi fare:

public class UDF extends EvalFunc<Boolean> { 



public Boolean exec(Tuple input) throws IOException { 

    if (input == null || input.size() == 0) 
     return false; 

    FileSystem fs = FileSystem.get(UDFContext.getUDFContext().getJobConf()); 


    String var1 = input.get(1).toString(); 
    InputStream var1In = fs.open(new Path(var1)); 


    String var2 = input.get(2).toString(); 
    InputStream var2In = fs.open(new Path(var2)); 

    String var3 = input.get(3).toString(); 
    InputStream var3In = fs.open(new Path(var3)); 



    return doyourthing(input.get(0).toString()); 
} 
} 

per esempio