标签:
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支持ODPS SQL的数据类型有:bigint, string, double, boolean以及datetime类型。ODPS数据类型与Java类型的对应关系如下:
ODPS SQL Type | Bigint | String | Double | Boolean | Datetime |
---|---|---|---|---|---|
Java Type | Long | String | Double | Boolean | Date |
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资源中:
添加资源具体操作见: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功能,后期开放就能正常使用了。
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/jyl932099427/article/details/47833395