491
微信
編寫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 {
@Override
public 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());
}
}
@Override
public void merge(Writable arg0, Writable arg1) throws UDFException {
LongWritable result = (LongWritable) arg0;
LongWritable partial = (LongWritable) arg1;
result.set(result.get() + partial.get());
}
@Override
public Writable newBuffer() {
return new LongWritable(0L);
}
@Override
public 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 {
@Override
public 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-阿裏雲