編寫UDF__快速開始_大數據計算服務-阿裏雲
MaxCompute 的 UDF 包括:UDF,UDAF,UDTF三種函數。通常情況下,此三種函數被統稱為 UDF。使用Maven的用戶可以從Maven庫中搜索”odps-sdk-udf”獲取不同版本的Java SDK,相關配置信息:
<dependency><groupId>com.aliyun.odps</groupId><artifactId>odps-sdk-udf</artifactId><version>0.20.7-public</version></dependency>
備注:
UDF示例
下麵我們將給出一個完整的開發UDF流程示例,例如,實現一個字符小寫轉換功能的UDF,需要經過如下幾個步驟:
- 代碼編寫:按照 MaxCompute UDF 框架的規定,實現函數功能,並進行編譯。下麵給出一個簡單的代碼實現:
package org.alidata.odps.udf.examples;import com.aliyun.odps.udf.UDF;public final class Lower extends UDF {public String evaluate(String s) {if (s == null) { return null; }return s.toLowerCase();}}
將這個jar包命名為”my_lower.jar”。
備注:SDK的使用信息請參考UDF SDK 。
- 添加資源:在運行UDF之前,必須指定引用的UDF代碼。用戶代碼通過資源的形式添加到ODPS中。Java UDF必須被打成jar包,以jar資源添加到ODPS中,UDF框架會自動加載jar包,運行用戶自定義的UDF。 ODPS MapReduce也用到了資源這一特有概念,MapReduce文檔中對資源的使用也有闡述。
執行命令:
add jar my_lower.jar;-- 如果存在同名的資源請將這個jar包重命名,-- 並注意修改下麵示例命令中相關jar包的名字;-- 又或者直接使用-f選項覆蓋原有的jar資源
- 注冊UDF函數:用戶的jar包被上傳後,使得 MaxCompute 有條件自動獲取用戶代碼並運行。但此時仍然無法使用這個UDF,因為 MaxCompute 中並沒有關於這個UDF的任何信息。因此需要用戶在 MaxCompute 中注冊一個唯一的函數名,並指定這個函數名與哪個jar資源的哪個函數對應。關於如何注冊 UDF,請參考 注冊函數 。運行命令:
CREATE FUNCTION test_lower AS org.alidata.odps.udf.examples.Lower USING my_lower.jar;
在sql中使用此函數:
select test_lower('A') from my_test_table;
UDAF示例
UDAF的注冊方式與UDF基本相同,使用方式與內建函數中得 聚合函數 相同。下麵是一個計算平均值的UDAF的代碼示例:
package org.alidata.odps.udf.examples;import com.aliyun.odps.io.LongWritable;import com.aliyun.odps.io.Text;import com.aliyun.odps.io.Writable;import com.aliyun.odps.udf.Aggregator;import com.aliyun.odps.udf.UDFException;/*** project: example_project* table: wc_in2* partitions: p2=1,p1=2* columns: colc,colb,cola*/public class UDAFExample extends Aggregator {@Overridepublic void iterate(Writable arg0, Writable[] arg1) throws UDFException {LongWritable result = (LongWritable) arg0;for (Writable item : arg1) {Text txt = (Text) item;result.set(result.get() + txt.getLength());}}@Overridepublic void merge(Writable arg0, Writable arg1) throws UDFException {LongWritable result = (LongWritable) arg0;LongWritable partial = (LongWritable) arg1;result.set(result.get() + partial.get());}@Overridepublic Writable newBuffer() {return new LongWritable(0L);}@Overridepublic Writable terminate(Writable arg0) throws UDFException {return arg0;}}
UDTF示例
UDTF的注冊方式與UDF基本相同,使用方式也與UDF相同。代碼示例:
package org.alidata.odps.udtf.examples;import com.aliyun.odps.udf.UDTF;import com.aliyun.odps.udf.UDTFCollector;import com.aliyun.odps.udf.annotation.Resolve;import com.aliyun.odps.udf.UDFException;// TODO define input and output types, e.g., "string,string->string,bigint".@Resolve({"string,bigint->string,bigint"})public class MyUDTF extends UDTF {@Overridepublic void process(Object[] args) throws UDFException {String a = (String) args[0];Long b = (Long) args[1];for (String t: a.split("\s+")) {forward(t, b);}}}
最後更新:2016-11-23 17:16:04
上一篇:
運行SQL__快速開始_大數據計算服務-阿裏雲
下一篇:
編寫MapReduce__快速開始_大數據計算服務-阿裏雲
OperationProgressType__數據類型_API 參考_雲服務器 ECS-阿裏雲
權限查看__用戶及授權管理_安全指南_大數據計算服務-阿裏雲
ColumnType__DataType_API 參考_表格存儲-阿裏雲
DescribeLoadBalancers__LoadBalancer相關API_API 參考_負載均衡-阿裏雲
遊戲盾___產品功能說明_產品常見問題_DDoS 高防IP-阿裏雲
設置主題屬性__主題操作_快速入門_消息服務-阿裏雲
多任務支持__命令行工具_批量計算-阿裏雲
擴容縮容Merge/Split__高級特性_DataHub實時數據通道_大數據計算服務-阿裏雲
管理執行計劃__執行計劃_用戶指南_E-MapReduce-阿裏雲
使用高防後源站IP暴露的解決辦法__運維問題_產品常見問題_DDoS 高防IP-阿裏雲
相關內容
常見錯誤說明__附錄_大數據計算服務-阿裏雲
發送短信接口__API使用手冊_短信服務-阿裏雲
接口文檔__Android_安全組件教程_移動安全-阿裏雲
運營商錯誤碼(聯通)__常見問題_短信服務-阿裏雲
設置短信模板__使用手冊_短信服務-阿裏雲
OSS 權限問題及排查__常見錯誤及排除_最佳實踐_對象存儲 OSS-阿裏雲
消息通知__操作指南_批量計算-阿裏雲
設備端快速接入(MQTT)__快速開始_阿裏雲物聯網套件-阿裏雲
查詢API調用流量數據__API管理相關接口_API_API 網關-阿裏雲
使用STS訪問__JavaScript-SDK_SDK 參考_對象存儲 OSS-阿裏雲