MaxCompute UDF概述

UDF(User-Defined Function)即自定义函数,当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操作步骤,并希望能直接查看代码实现逻辑时,您可以直接将JavaPython代码嵌入SQL脚本。

SQL自定义函数

当您的代码中存在很多相似部分时,可以通过SQL自定义函数实现,提高代码复用率的同时还可以简化操作流程。

UDF(地理空间)

支持在MaxCompute中使用Hive地理空间函数分析空间数据。

使用限制

  • 访问外网

    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');

开发UDF:支持的工具与通用流程

自定义标量函数(UDF\UDTF\UDAF)的开发流程如下。

说明

UDF(嵌入式)SQL自定义函数UDF(地理空间)的开发流程与此不同,请以对应文档描述为准。

使用Java开发

当您使用Java代码编写MaxCompute UDF时,开发流程如下。

Java开发流程

步骤

步骤描述

支持的工具平台

注意事项/相关文档

可选

当您使用Maven编写代码时,需要先在Pom文件中添加代码相关SDK依赖,确保后续编写的代码可编译成功。例如开发自定义函数需要添加的SDK依赖为:

<dependency>
    <groupId>com.aliyun.odps</groupId>
    <artifactId>odps-sdk-udf</artifactId>
   <version>0.29.10-public</version>
</dependency>

您可以从Maven中搜索odps-sdk-udf,获取SDK依赖版本信息。

  • IntelliJ IDEA(Maven)

必选

根据业务需求,编写自定义函数代码。

使用Java开发UDF时需满足Java UDF的开发规范,详情请参见UDF开发规范与通用流程(Java)

必选

通过本地运行或单元测试方式调试自定义函数,查看运行结果是否符合预期。

必选

调试自定义函数代码,确保本地运行成功后打包为JAR包。

必选

JAR包作为资源上传至MaxCompute项目。

必选

基于上传的JAR包资源创建自定义函数。

可选

在查询数据代码中调用自定义函数。

使用Python开发

当您使用Python代码编写MaxCompute UDF时,开发流程如下。Python开发流程

步骤

步骤描述功能介绍

支持的工具平台

注意事项/相关文档

必选

根据业务需求,编写自定义函数代码。

MaxCompute Studio

使用Python开发UDF时需满足Python UDF的开发规范,详情请参见UDF开发规范与通用流程(Python3)UDF开发规范与通用流程(Python2)

必选

通过本地运行或单元测试方式调试自定义函数,查看运行结果是否符合预期。

必选

Python文件或依赖的资源(例如文件资源、表资源、第三方包)上传至MaxCompute项目。

必选

基于上传的Python文件或依赖的资源创建自定义函数。

可选

在查询数据代码中调用自定义函数。

开发参考:MaxCompute SDK

MaxCompute为您提供了SDK,信息如下。您在开发UDF过程中如果需要使用MaxCompute SDK包,可在MaxCompute SDK中查看各SDK中包含的Package,以及Package中的Class详细信息。

SDK名称

描述

odps-sdk-core

提供操作MaxCompute基本资源的类。

odps-sdk-commons

Java Util封装。

odps-sdk-udf

UDF功能的主体接口。

odps-sdk-mapred

MapReduce API。

odps-sdk-graph

Graph API。

调用UDF

开发完成UDF并将UDF注册至MaxCompute后,在后续开发作业过程中您即可使用此UDF函数。自定义函数的使用方法如下:

  • 在归属MaxCompute项目中使用自定义函数:使用方法与内建函数类似,您可以参照内建函数的使用方法使用自定义函数。

  • 跨项目使用自定义函数:即在项目A中使用项目B的自定义函数,跨项目分享语句示例:select B:udf_in_other_project(arg0, arg1) as res from table_t;。更多跨项目分享信息,请参见基于Package跨项目访问资源

UDF开发示例