编写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-阿里云