【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文件,然后使用ODPSclient上传到ODPS资源中:

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


3、创建函数

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;

特殊说明:异常:Do not allow java UDF in project: ls_saas_jyltest是由于阿里云ODPS如今还没有全然开放UDF和MR功能,后期开放就能正常使用了。

原文地址:https://www.cnblogs.com/jhcelue/p/7273475.html