MaxCompute支持您通过Java、Python语言编写代码创建UDAF,扩展MaxCompute的函数能力,满足个性化业务需求。本文为您介绍UDAF类型、使用限制、注意事项、开发流程及使用说明等信息。
背景信息
UDAF为用户自定义聚合函数,适用于多进一出业务场景。即其输入与输出是多对一的关系,将多条输入记录聚合成一个输出值。MaxCompute支持您通过如下两种代码语言编写UDAF。
UDAF类型 | 说明 |
Java UDAF | 使用Java语言编写UDAF逻辑实现代码。更多信息,请参见Java UDAF。 |
Python UDAF | 使用Python语言编写UDAF逻辑实现代码,支持Python 2和Python 3:
|
使用限制
访问外网
MaxCompute默认不支持通过自定义函数访问外网。如果您需要通过自定义函数访问外网,请根据业务情况填写并提交网络连接申请表单,MaxCompute技术支持团队会及时联系您完成网络开通操作。表单填写指导,请参见网络开通流程。
访问VPC网络
MaxCompute默认不支持通过UDF访问VPC网络。如果您的UDF涉及访问VPC网络中的资源时,需要先创建MaxCompute与目标VPC网络间的网络连接,才可以直接通过UDF访问VPC网络中的资源,操作详情请参见通过UDF访问VPC网络资源。
读取表数据
目前版本不支持使用UDF/UDAF/UDTF读取以下场景的表数据:
做过表结构修改(Schema Evolution)的表数据。
包含复杂数据类型的表数据。
包含JSON数据类型的表数据。
Transactional表的表数据。
注意事项
使用自定义函数时,您需要注意:
在性能上,自定义函数的性能低于内建函数,建议您优先使用内建函数实现相同逻辑的业务需求。
在SQL语句中使用自定义函数时,如果计算的数据量过大并且存在倾斜,会导致作业占用的内存超出默认分配的内存。此时,您可以在Session级别设置
set odps.sql.udf.joiner.jvm.memory=xxxx;
属性来解决此问题。更多自定义函数常见问题,请参见MaxCompute UDF常见问题。当自定义函数的名称与内建函数的名称相同时,自定义函数会覆盖同名的内建函数。例如,MaxCompute中存在一个名称为CONCAT的自定义函数,则系统默认会调用自定义的CONCAT,不会调用内建函数CONCAT。如果您希望调用内建函数,需要在内建函数前增加
::
符号,例如select ::concat('ab', 'c');
。
开发流程
UDAF的开发流程如下。
使用Java开发
当您使用Java代码编写MaxCompute UDF时,开发流程如下。
步骤 | 步骤描述 | 支持的工具平台 | 注意事项/相关文档 | |
① | 可选 | 当您使用Maven编写代码时,需要先在Pom文件中添加代码相关SDK依赖,确保后续编写的代码可编译成功。例如开发自定义函数需要添加的SDK依赖为:
您可以从Maven库中搜索 |
| 无 |
② | 必选 | 根据业务需求,编写自定义函数代码。 |
| 使用Java开发UDF时需满足Java UDF的开发规范,详情请参见UDF开发规范与通用流程(Java)。 |
③ | 必选 | 通过本地运行或单元测试方式调试自定义函数,查看运行结果是否符合预期。 | ||
④ | 必选 | 调试自定义函数代码,确保本地运行成功后打包为JAR包。 | ||
⑤ | 必选 | 将JAR包作为资源上传至MaxCompute项目。 |
| |
⑥ | 必选 | 基于上传的JAR包资源创建自定义函数。 | ||
⑦ | 可选 | 在查询数据代码中调用自定义函数。 | 无 |
使用Python开发
当您使用Python代码编写MaxCompute UDF时,开发流程如下。
步骤 | 步骤描述功能介绍 | 支持的工具平台 | 注意事项/相关文档 | |
① | 必选 | 根据业务需求,编写自定义函数代码。 | 使用Python开发UDF时需满足Python UDF的开发规范,详情请参见UDF开发规范与通用流程(Python3)、UDF开发规范与通用流程(Python2)。 | |
② | 必选 | 通过本地运行或单元测试方式调试自定义函数,查看运行结果是否符合预期。 | ||
③ | 必选 | 将Python文件或依赖的资源(例如文件资源、表资源、第三方包)上传至MaxCompute项目。 |
| |
④ | 必选 | 基于上传的Python文件或依赖的资源创建自定义函数。 | ||
⑤ | 可选 | 在查询数据代码中调用自定义函数。 | 无 |
调用UDF
开发完成UDF并将UDF注册至MaxCompute后,在后续开发作业过程中您即可使用此UDF函数。自定义函数的使用方法如下:
在归属MaxCompute项目中使用自定义函数:使用方法与内建函数类似,您可以参照内建函数的使用方法使用自定义函数。
跨项目使用自定义函数:即在项目A中使用项目B的自定义函数,跨项目分享语句示例:
select B:udf_in_other_project(arg0, arg1) as res from table_t;
。更多跨项目分享信息,请参见基于Package跨项目访问资源。