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