2016-03-28 27 views
0

Birden fazla Domuz UDF tanımlamak istiyorum. Her biri verilerin farklı bir bölümünü çıkaracak. Benim durumumda, veri birçok iç içe JSON nesnesi içeren karmaşık bir yapıya sahip JSON belgeleridir.Domuz: Bir sınıfta birden fazla UDF

Sorun şu ki, ihtiyacım olan her işlev için farklı bir Eval sınıfı oluşturdum. Bu sınıfların her biri exec() uygular. Tüm fonksiyonları aynı UDF sınıfına koymanın ve onları domuzdan çağırmanın bir yolu var mı? Benim UDF birinin

Örnek:

public class PigGetTimestamps extends EvalFunc<Tuple>{ 
    public Tuple exec(org.apache.pig.data.Tuple input) throws IOException {   

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

    try { 

     String inputString = DataType.toString(input.get(0)); 
     try 
     { 
      String[] tokens=inputString.split("\t"); 
      if (tokens.length<1) 
       return null; 
      Document document=new Document(tokens[0], true, false); 
      long timestamp_fetch=document.getTimestamp_fetch(); 
      long timestamp_pub=document.getTimestampPub(); 
      Tuple output = TupleFactory.getInstance().newTuple(2); 
      output.set(0,timestamp_pub); 
      output.set(1,timestamp_fetch); 
      return output; 
     } 
     catch(Exception e) 
     { 
      return null; 
     } 

    } catch (Exception e) { 
     System.out.println("Can't extract field; error = " + e.getMessage()); 
     return null; 
    }   
} 

cevap

0

Bunun çeşitli örneklerini oluşturmak, aynı sınıfını kullanabilirsiniz - yapıcı içinde bunu Yani

ne yapacağı işlevi devlet ne zaman senin

define udf1 my.package.udf.MultiFunc('1'); 
define udf2 my.package.udf.MultiFunc('2'); 

Ve UDF sınıf gibi görünecektir:: domuz farklı örneklerini tanımlayacak

public class MultiFunc extends EvalFunc<String> { 

     private String operation; 
     public MultiFunc(String operation){ 
      this.data = operation; 

     } 

     @Override 
     public String exec(Tuple tuple) throws IOException { 
     switch (operation){ 
      case "+": 
       //your code here; 
       break; 

      case "-": 
       //your code here; 
       break; 

      break; 

     }   
} 
+0

Herhangi bir standart yol var mı, sonucu alabilirsin ama bu bir hack – Athar