文档

UDTF概述

更新时间:

MaxCompute支持您通过Java、Python语言编写代码创建UDTF,扩展MaxCompute的函数能力,满足个性化业务需求。本文为您介绍UDTF类型、使用限制、注意事项、开发流程及使用说明等信息。

背景信息

UDTF为用户自定义表值函数,适用于一进多出业务场景。即其输入与输出是一对多的关系,读入一行数据,输出多个值可视为一张表。MaxCompute支持您通过如下两种代码语言编写UDTF。

UDTF类型

说明

Java UDTF

使用Java语言编写UDTF逻辑实现代码。更多信息,请参见Java UDTF

Python UDTF

使用Python语言编写UDTF逻辑实现代码,支持Python 2和Python 3:

  • Python 2 UDTF:Python语言版本为2.7。更多信息,请参见Python 2 UDTF

  • Python 3 UDTF:Python语言版本为CPython-3.7.3。更多信息,请参见Python 3 UDTF

MaxCompute支持的内建函数中包含部分UDTF函数,例如EXPLODE,更多内建UDTF函数信息,请参见其他函数复杂类型函数

使用限制

  • 不支持通过自定义函数访问外网。如果您需要通过自定义函数访问外网,请根据业务情况填写并提交表单,MaxCompute技术支持团队会及时联系您完成网络开通操作。表单填写指导,请参见网络开通流程

  • select语句中使用UDTF时,不允许存在其他列或表达式。错误示例如下。

    --查询语句中同时携带了UDTF和其他列。
    select value, user_udtf(key) as mycol ...
  • UDTF不能嵌套使用。错误示例如下。

    --user_udtf1嵌套了user_udtf2,不允许嵌套。
    select user_udtf1(user_udtf2(key)) as mycol...;
  • 不支持在同一个select子句中与group bydistribute bysort by联用。错误示例如下。

    --UDTF不能与group by联用。
    select user_udtf(key) as mycol ... group by mycol;

注意事项

使用自定义函数时,您需要注意:

  • 在性能上,自定义函数的性能低于内建函数,建议您优先使用内建函数实现相同逻辑的业务需求。

  • 在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开发

当您使用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文件或依赖的资源创建自定义函数。

可选

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

调用UDF

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

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

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