2015-09-06 98 views
0
使用UDF

我已經寫了一個樣本UDF在蜂巢從表TRIM的字符串:創建,添加和蜂巢

package anoop; 


import org.apache.hadoop.hive.ql.exec.UDF; 

import org.apache.hadoop.io.Text; 

public class DataTrim extends UDF{ 

String trimmed; 

public Text trim(Text incomingData){ 

    trimmed= incomingData.toString().trim(); 

    return new Text(trimmed); 
} 


} 

我創建了一個罐子對於這種「trim_string.jar」並將其保存到配置單元庫文件夾。 現在我跑了以下內容:

add jar '~/hive-1.2.1/lib/trim_string.jar'; (success) 

現在我運行

create temporary function trimmed1 as 'anoop.DataTrim'; 

但我得到以下錯誤:

FAILED: Class anoop.DataTrim does not implement UDF, GenericUDF, or UDAF 
FAILED: Execution Error, return code 1 from  org.apache.hadoop.hive.ql.exec.FunctionTask 

可以請一些幫助?提前致謝!

回答

3

配置單元UDF必須包含名爲evaluate的函數。命名trim功能重命名爲evaluate

public Text evaluate(Text incomingData)

String trimmed是不必要的,因爲類成員。你可以把它作爲局部變量來運行。

package anoop; 


import org.apache.hadoop.hive.ql.exec.UDF; 
import org.apache.hadoop.io.Text; 

public class DataTrim extends UDF{ 

    public Text evaluate(Text incomingData){ 
     String trimmed; 
     trimmed= incomingData.toString().trim(); 
     return new Text(trimmed); 
    } 


} 

欲瞭解更多信息,請參閱本tutorial

+0

嗨, 我試着用上面的代碼,但現在我得到錯誤: 失敗:SemanticException [錯誤10014]:第1行:7周錯誤的論點「preciptotal ':沒有與(字符串)類anoop.DataTrim匹配的方法。可能的選擇:.......................... 我使用的命令是:從小時數限制10中選擇trimmed1(skyconds); trimmed1是創建的臨時函數。 請幫忙。 –

+0

嗨。似乎我沒有正確創建JAR。我使用上面的代碼重新創建了它。現在完美。非常感謝幫助! –