UDF(User Defined Function)即用户自定义函数。MaxCompute提供多种内建函数来满足您的计算需求,同时您还可以通过创建自定义函数来满足更多的计算需求。

UDF广义的定义是自定义标量函数、自定义聚合函数及自定义表函数三种类型的自定义函数的集合。狭义的定义仅代表用户自定义标量函数。文档中将经常出现UDF这一名词,请您根据上下文内容理解其具体含义。

UDF的使用方法与普通的内建函数类似。Java和MaxCompute数据类型的对应关系,请参见参数与返回值类型
说明 当UDF的命名与内建函数的命名相同时,使用select ::函数名(表达式) ;语法调用内建函数。例如,MaxCompute中包含命名为CONCAT的UDF,则系统默认调用此UDF,不会调用CONCAT内建函数。如果希望调用CONCAT内建函数,需要执行select ::concat('ab', 'c') ;语法。

UDF分类

MaxCompute支持的UDF有三种,如下表所示。
UDF 分类 描述
UDF(User Defined Scalar Function) 用户自定义标量值函数。其输入与输出是一对一的关系,即读入一行数据,写一条输出值 。
UDTF(User Defined Table Valued Function) 自定义表值函数。用来解决一次函数调用输出多行数据的需求。它是唯一能够返回多个字段的自定义函数。UDTF不等于UDT(User Defined Type)。
UDAF(User Defined Aggregation Function) 自定义聚合函数。其输入与输出是多对一的关系, 即将多条输入记录聚合成一条输出值。它可以与SQL中的GROUP BY语句联用。具体语法请参见聚合函数
说明 在SQL语句中使用自定义函数时,可能提示内存不足。这是由于计算的数据量过大并且存在倾斜,导致任务超出默认分配的内存。这种情况下,您可以通过set odps.sql.udf.joiner.jvm.memory=xxxx;set odps.sql.udf.joiner.jvm.memory=xxxx;语句手动设置内存来解决此问题。

MaxCompute的UDF支持跨项目分享,即在项目A中可以使用项目B的UDF。跨项目分享的SQL语句为select other_project:udf_in_other_project(arg0, arg1) as res from table_t;,具体示例请参见授权

UDF SDK依赖安装

如果您使用Maven,可以从Maven库中搜索odps-sdk-udf,从而获取不同版本的Java SDK,相关配置信息如下所示。
<dependency>
    <groupId>com.aliyun.odps</groupId>
    <artifactId>odps-sdk-udf</artifactId>
   <version>0.29.10-public</version>
</dependency>