MaxCompute UDF(User Defined Function)即用户自定义函数。MaxCompute产品已经提供多种类型内建函数来满足您的业务需求,当内建函数无法支撑业务实现时,您可以自行编写代码逻辑来创建自定义函数满足多样化需求。本文为您介绍MaxCompute支持的自定义函数类型、应用场景、开发流程及使用说明等信息。
背景信息
广义的UDF定义是自定义标量函数(UDF)、自定义表值函数(UDTF)及自定义聚合函数(UDAF)三种类型的自定义函数的集合。狭义的UDF仅代表用户自定义标量函数。MaxCompute UDF支持的自定义函数类型如下。
自定义函数类型 | 名称 | 应用场景 |
---|---|---|
UDF | User Defined Scalar Function。用户自定义标量函数。 | 适用于一进一出业务场景。即其输入与输出是一对一的关系,读入一行数据,输出一个值。 |
UDTF | User Defined Table Valued Function。用户自定义表值函数,又称表格UDF。 | 适用于一进多出业务场景。即其输入与输出是一对多的关系,读入一行数据,输出多个值可视为一张表。 |
UDAF | User Defined Aggregation Function。用户自定义聚合函数。 | 适用于多进一出业务场景。即其输入与输出是多对一的关系,将多条输入记录聚合成一个输出值。 |
除上述自定义函数外,MaxCompute还提供如下针对特殊场景的能力支撑。
自定义函数类型 | 应用场景 |
---|---|
代码嵌入式UDF | 当您需要简化MaxCompute UDF操作步骤,并希望能直接查看代码实现逻辑时,您可以直接将Java或Python代码嵌入SQL脚本。 |
SQL语言定义函数 | 当您的代码中存在很多相似部分时,可以通过SQL自定义函数实现,提高代码复用率的同时还可以简化操作流程。 |
开源地理空间UDF | 支持在MaxCompute中使用Hive地理空间函数分析空间数据。 |
使用限制
不支持通过自定义函数访问外网。如果您需要通过自定义函数访问外网,请根据业务情况填写并提交网络连接申请表单,MaxCompute技术支持团队会及时联系您完成网络开通操作。表单填写指导,请参见网络开通流程。
注意事项
使用自定义函数时,您需要注意:
- 在性能上,自定义函数的性能低于内建函数,建议您优先使用内建函数实现相同逻辑的业务需求。
- 在SQL语句中使用自定义函数时,如果计算的数据量过大并且存在倾斜,会导致作业占用的内存超出默认分配的内存。此时,您可以在Session级别设置
set odps.sql.udf.joiner.jvm.memory=xxxx;
属性来解决此问题。更多自定义函数常见问题,请参见MaxCompute UDF常见问题。 - 当自定义函数的名称与内建函数的名称相同时,自定义函数会覆盖同名的内建函数。例如,MaxCompute中存在一个名称为CONCAT的自定义函数,则系统默认会调用自定义的CONCAT,不会调用内建函数CONCAT。如果您希望调用内建函数,需要在内建函数前增加
::
符号,例如select ::concat('ab', 'c');
。
开发流程
自定义函数(UDF\UDTF\UDAF)的开发流程如下。代码嵌入式UDF、SQL语言定义函数、开源地理空间UDF的开发流程与此不同,请以对应文档描述为准。
- 当您使用Java代码编写MaxCompute UDF时,开发流程如下。
序号 可选/必选步骤 功能介绍 工具平台 相关文档 ① 可选 当您使用Maven编写代码时,需要先在Pom文件中添加代码相关SDK依赖,确保后续编写的代码可编译成功。例如开发自定义函数需要添加的SDK依赖为:
您可以从Maven库中搜索<dependency> <groupId>com.aliyun.odps</groupId> <artifactId>odps-sdk-udf</artifactId> <version>0.29.10-public</version> </dependency>
odps-sdk-udf
,获取SDK依赖版本信息。IntelliJ IDEA(Maven) 无 ② 必选 根据业务需求,编写自定义函数代码。 IntelliJ IDEA(Maven)、MaxCompute Studio 开发Java UDF ③ 必选 通过本地运行或单元测试方式调试自定义函数,查看运行结果是否符合预期。 ④ 必选 调试自定义函数代码,确保本地运行成功后打包为JAR包。 ⑤ 必选 将JAR包作为资源上传至MaxCompute项目。 MaxCompute客户端(odpscmd)、MaxCompute Studio、DataWorks - MaxCompute客户端
- MaxCompute Studio
- DataWorks
⑥ 必选 基于上传的JAR包资源创建自定义函数。 ⑦ 可选 在查询数据代码中调用自定义函数。 无 - 当您使用Python代码编写MaxCompute UDF时,开发流程如下。
序号 可选/必选步骤 功能介绍 工具平台 相关文档 ① 必选 根据业务需求,编写自定义函数代码。 MaxCompute Studio 开发Python UDF ② 必选 通过本地运行或单元测试方式调试自定义函数,查看运行结果是否符合预期。 ③ 必选 将Python文件或依赖的资源(例如文件资源、表资源、第三方包)上传至MaxCompute项目。 MaxCompute客户端(odpscmd)、MaxCompute Studio、DataWorks - MaxCompute客户端
- MaxCompute Studio
- DataWorks
④ 必选 基于上传的Python文件或依赖的资源创建自定义函数。 ⑤ 可选 在查询数据代码中调用自定义函数。 无
使用说明
自定义函数的使用方法如下:
- 在归属MaxCompute项目中使用自定义函数:使用方法与内建函数类似,您可以参照内建函数的使用方法使用自定义函数。
- 跨项目使用自定义函数:即在项目A中使用项目B的自定义函数,跨项目分享语句示例:
select B:udf_in_other_project(arg0, arg1) as res from table_t;
。更多跨项目分享信息,请参见基于Package跨项目访问资源。
MaxCompute SDK
MaxCompute提供的SDK信息如下。各SDK中包含的Package,以及Package中的Class详细信息,请参见MaxCompute SDK。
SDK名称 | 描述 |
---|---|
odps-sdk-core | 提供操作MaxCompute基本资源的类。 |
odps-sdk-commons | Java Util封装。 |
odps-sdk-udf | UDF功能的主体接口。 |
odps-sdk-mapred | MapReduce API。 |
odps-sdk-graph | Graph API。 |