2014-01-22 84 views
2

我已經寫了下面的UDF:Hadoop的蜂巢UDF失敗

ISO8601ToHiveFormat.java:

package hiveudfs; 

import org.apache.hadoop.hive.ql.exec.UDF; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

public class ISO8601ToHiveFormat extends UDF { 

    public String hourFromISO8601(final String d){ 
     try{ 
      if(d == null) 
       return null; 
      SimpleDateFormat sdf1= new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); 
      SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
      return sdf2.format(sdf1.parse(d)); 
     } catch (ParseException pe) { 
      return null; 
     } 
    } 
} 

在我的項目的src文件夾,我跑了follwing編譯命令編譯:

javac -cp /usr/lib/hive/lib/hive-exec-0.10.0-cdh4.3.0.jar ISO8601ToHiveFormat.java 

和supsequntly我包裝成一個罐子

jar cf ../../HiveUDFs.jar hiveudfs/ISO8601ToHiveFormat.* 

所以,然後我就開始蜂巢,做:

hive> add jar /home/tom/Java/HiveUDFs.jar; 
Added /home/tom/Java/HiveUDFs.jar to class path 
Added resource: /home/tom/Java/HiveUDFs.jar 
hive> create temporary function hourFromISO8601 as 'hiveudfs.ISO8601ToHiveFormat'; 
OK 
Time taken: 0.083 seconds 
hive> SELECT hourFromISO8601(logtimestamp) FROM mytable LIMIT 10; 
FAILED: SemanticException [Error 10014]: Line 1:7 Wrong arguments 'logtimestamp': No matching method for class hiveudfs.ISO8601ToHiveFormat with (string). Possible choices: 
hive> 

hive> describe mytable; 
OK 
... 
logtimestamp string 
... 

輸出什麼我做錯了什麼?

回答

2

toom - 您必須重寫此(評估)方法。那麼只有UDF的作品

public class yourclassname extends UDF { 

     public String **evaluate**(your args) { 

     // your computation logic 

     return your_result; 
    } 

} 
+0

好吧,作品!非常感謝 :) – toom

0

由於ramisetty.vijay說,你需要重寫evaluate()方法。請注意,您可以提供多種不同的輸入參數以及返回類型的評估實現。