2016-07-29 105 views
1

這裏是UDF代碼豬的Java版本UDF

package myudf; 
import java.io.IOException; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

import org.apache.pig.EvalFunc; 
import org.apache.pig.data.Tuple; 

public class DateFormat extends EvalFunc<String> { 
    public String exec(Tuple input) throws IOException { 
     if (input == null || input.size() == 0) { 
      return null; 
     } 

     try { 
      String dateStr = (String)input.get(0); 
      SimpleDateFormat readFormat = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss.SSS aa"); 
      SimpleDateFormat writeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
      Date date = null; 
      try { 
       date = readFormat.parse(dateStr); 
      } catch (ParseException e) { 
       e.printStackTrace(); 
      } 

      return writeFormat.format(date).toString(); 
     } catch(Exception e) { 
      throw new IOException("Caught exception processing input row ", e); 
     } 
    } 
} 

導出的這一個Jar和咕嚕註冊

Register /local/path/to/UDFDate.jar; 
    A = LOAD 'hdfs date file'; 
    B = FOREACH A GENERATE UDFDate.myudf.DateFormat($0); 

提供錯誤

[主要] ERROR org.apache。 pig.tools.grunt.Grunt - 錯誤1070:不能 使用導入來解析UDFDate.DateFormat:[,java.lang。, org.apache.pig.builtin。, org.apache.pig.impl.builtin。]

+0

是什麼myudf。你的包UDFDate中有java文件myudf嗎? –

+0

'DateFormat.java'文件中的第一行是什麼? –

+0

對不起我們..我錯過了包名.. – TKHN

回答

1

你不需要指定jar名稱(UDFDate.myudf.DateFormat)來調用jar中的函數。它應該是「packageName.className」(myudf.DateFormat)。


如果DateFormatmyudf包,那麼你應該運行爲:

B = FOREACH A GENERATE myudf.DateFormat($0);


如果DateFormatdefault包,那麼你應該爲正在運行:

B = FOREACH A GENERATE DateFormat($0);

+0

工作!!!!!謝謝 – TKHN

0

打電話給你的UDF爲:

packagename.classname($0); 
0

答案已經給出了已經但爲了基本上不會重新定義UDF調用每次可以將其簡化:

Register /local/path/to/UDFDate.jar; 
DEFINE myDateFormat myudf.DateFormat(); 
A = LOAD 'hdfs date file'; 
B = FOREACH A GENERATE myDateFormat($0);