2013-08-12 5 views
0

Быстрый q на Pig UDF.Свинья UDF, которые принимают несколько входов

У меня есть пользовательский UDF, что я хочу, чтобы принять несколько столбцов:

package pigfuncs; 

import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 
import org.apache.pig.EvalFunc; 
import org.apache.pig.FuncSpec; 
import org.apache.pig.data.DataBag; 
import org.apache.pig.data.DataType; 
import org.apache.pig.data.Tuple; 
import org.apache.pig.impl.logicalLayer.FrontendException; 
import org.apache.pig.impl.logicalLayer.schema.Schema; 

public class DataToXML extends EvalFunc<String> { 


     public DataToXML() { 

     } 

     @Override 
     public List<FuncSpec> getArgToFuncMapping() 
      throws FrontendException { 
     List<FuncSpec> funcList = new ArrayList<FuncSpec>(); 
     funcList.add(new FuncSpec(this.getClass().getName(), 
      new Schema(new Schema.FieldSchema(null, DataType.CHARARRAY)))); 

     return funcList; 
     } 

     @Override 
     public String exec(Tuple t) throws IOException { 


     if (t == null || t.size() == 0) 
      return ""; 


     StringBuilder result = new StringBuilder(); 

     result.append("<Num>"); 
     result.append((String) t.get(0)); 
     result.append("</Num>"); 

     result.append("<Tags>"); 
     result.append((String) t.get(1)); 
     result.append("</Tags"); 


     return result.toString(); 
     } 

} 

Я хочу передать 2 колонки; Номер и данные. Я хочу, чтобы выход был XYZabc

Я не могу понять, как заставить скрипт свиньи называть это, каждая комбинация приводит к другой ошибке!

Отрывок из моего сценария:

-- apply some sort of UDF that returns the exact line without the stop words 
nostop = FOREACH cleansed GENERATE lotnum,pigfuncs.StopWords(description) as data; 

-- put into xml 
out = FOREACH nostop GENERATE pigfuncs.DataToXML(lotnum, data); 

ошибка от этого:

не удалось вывести функцию согласования для rapp.pigfuncs.DataToXML как несколько или ни один из них подходит. Пожалуйста, используйте явное приведение.

Надежда это легко один для гуру свинок :)

Дункан

ответ

2

Ваше getArgToFuncMapping() реализация означает, что Вы ожидаете только один аргумент. (Вы добавили только одно поле в funcList.) Если вы не собираетесь предоставлять несколько реализаций для этого UDF в зависимости от типов аргументов, нет реальной потребности в реализации getArgToFuncMapping(). Просто пропустите его, и эта ошибка исчезнет.