【ODPS】UDF基础



UDF全称User Defined Function,即用户自定义函数。ODPS提供了很多内建函数来满足用户的计算需求,同时用户还可以通过创建自定义函数来满足 不同的计算需求。

UDF种类:

UDF 分类 描述
User Defined Scalar Function,通常也称之为UDF 用户自定义标量值函数(User Defined Scalar Function)通常也称之为UDF。其输入与输出是一对一的关系,即读入一行数据,写出一条输出值。
UDTF(User Defined Table Valued Function) 自定义表值函数,是用来解决一次函数调用输出多行数据场景的,也是唯一能返回多个字段的自定义函数。而UDF只能一次计算输出一条返回值。
UDAF(User Defined Aggregation Function) 自定义聚合函数,其输入与输出是多对一的关系, 即将多条输入记录聚合成一条输出值。可以与 SQL中的Group By语句联用。具体语法请参考 聚合函数 
  • UDF广义的说法代表了自定义标量函数,自定义聚合函数及自定义表函数三种类型的自定义函数的集合。狭义来说,仅代表用户自定义标量函数。 文档会经常使用这一名词,请读者根据文档上下文判断具体含义。


UDF参数与返回值类型:

UDF支持ODPS SQL的数据类型有:bigint, string, double, boolean以及datetime类型。ODPS数据类型与Java类型的对应关系如下:

ODPS SQL Type Bigint String Double Boolean Datetime
Java Type Long String Double Boolean Date


  • SQL中的NULL值通过Java中的NULL引用表示,因此Java primitive type是不允许使用的,因为无法表示SQL中的NULL值。


UDF应用实例:URL解码

例如在搜索查询中通常会对URL进行URL编码(Encode)。比如“阿里云”在URL中被编码成“%e9%98%bf%e9%87%8c%e4%ba%91”,我们现在就可以写一个简答的UDF进行解码操作。


1、代码实现

Java UDF必须继承com.aliyun.odps.udf.UDF类。

package com.aliyun.odps.udf;

import com.aliyun.odps.udf.UDF;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
public class URLDecode extends UDF {

	public String evaluate(String url) throws UnsupportedEncodingException{
		if(url.isEmpty() || url==null){
			return "";
		}
		return URLDecoder.decode(url, "UTF-8");
	}

}

1)自定义类必须实现evaluate方法。该方法根据输入输出类型只支持四种:String、Long、Double、Boolean,注意是对象,不是基本数据类型,他们对应ODPS的String、Bigint、Double、Boolean四种数据类型。

2)参数个数可以子定义,系统可以自动识别。


2、资源上传

将上述代码生成JAR文件,然后使用ODPS客户端上传到ODPS资源中:

【ODPS】UDF基础_第1张图片

添加资源具体操作见:https://docs.aliyun.com/?spm=5176.383718.4.6.Crqixn#/pub/odps/basic/common_command&resources


3、创建函数

【ODPS】UDF基础_第2张图片

ODPS函数具体操作见:https://docs.aliyun.com/?spm=5176.383718.4.6.Crqixn#/pub/odps/basic/common_command&functions


4、在SQL中使用自定义函数

现在就可以使用自定函数urldecode().

select urldecode("%E9%98%BF%E9%87%8C%E4%BA%91%0A") as url from dual limit 1;

【ODPS】UDF基础_第3张图片

特殊说明:异常:Do not allow java UDF in project: ls_saas_jyltest是因为阿里云ODPS现在还没有完全开放UDF和MR功能,后期开放就能正常使用了。

你可能感兴趣的:(阿里云)