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、创建函数

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

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;

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

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

【ODPS】UDF基础的更多相关文章

  1. odps编写UDF的实现

    问题 尝试写一个UDF,参数支持输入x,y与一个Polygon,返回结果是(x,y)是否在输入的Geometry之内? 环境 eclipse odps 插件 jts包:jts-1.8.jar 解法 i ...

  2. odps 使用参考 & tips

    1.  自定义udf 编写udf 1)pom.xml <dependency> <groupId>com.aliyun.odps</groupId> <art ...

  3. ODPS_ele—UDF Python API

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

  4. 如何在MaxCompute上处理存储在OSS上的开源格式数据

    0. 前言 MaxCompute作为使用最广泛的大数据平台,内部存储的数据以EB量级计算.巨大的数据存储量以及大规模计算下高性能数据读写的需求,对于MaxCompute提出了各种高要求及挑战.处在大数 ...

  5. UDF2

    问题 根据给定的gps点point(x,y)和北京的shape数据,关联出 AOI ID IO 输入 gps点表 create table gps ( x double, //经度 y double ...

  6. MaxCompute studio FAQ

    1. 官方文档地址 https://help.aliyun.com/document_detail/50889.html 2. Show Table Detail 中文乱码 原因是Intellij A ...

  7. 阿里云MaxCompute 2019-6月刊

    您好,MaxCompute 2019.6月刊为您带来6月产品.技术最新动态,欢迎阅读. 导读 [功能发布]6月产品重要发布 [文档更新]6月重要文档更新推荐 [干货精选]6月精选技术文章推荐 [活动回 ...

  8. MaxCompute 费用暴涨之新增SQL分区裁剪失败

    现象:因业务需求新增了SQL任务,这SQL扫描的表为分区表,且SQL条件里表只指定了一个分区,按指定的分区来看数据量并不大,但是SQL的费用非常高.费用比预想的结果相差几倍甚至10倍以上. 若只知道总 ...

  9. ODPS基础

    遇到一个项目需求是统计128张分库分表的数据表记录的最大id,通过单表查询计算非常费时,也无法应对分表数更多的情况,因此考虑到通过odps进行任务发布和运算 在云端 http://d2.alibaba ...

随机推荐

  1. c++基础学习之函数与参数

    1.传值参数 //传值参数 int Abc(int a,int b,int c) { ; } a,b和c是函数Abc 的形式参数formal parameter,类型均为整型.如果在如下语句中调用函数 ...

  2. [BZOJ4897][THUSC2016]成绩单(DP)

    4897: [Thu Summer Camp2016]成绩单 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 220  Solved: 132[Subm ...

  3. [BZOJ 4057] Kingdoms

    Link: BZOJ 4057 传送门 Solution: 一道比较基础的状压DP 看到$n<=20$,状态转移与顺序相关,就可以开心地状压了 1表示破产,0表示未破产,不断扩展破产的集合即可 ...

  4. 倒置输入的数 Exercise07_02

    import java.util.Scanner; /** * @author 冰樱梦 * 时间:2018年下半年 * 题目:倒置输入的数 * */ public class Exercise07_0 ...

  5. Scala实战高手****第1课:大数据时代的“黄金”语言Scala

    共计28课,每节课程在1个小时左右. 每天至少2个课程.预计在11.30号完成. ——————————————————

  6. spark DiskBlockManager

    RDD本身presist可以是本地存储,本地存储级别的持久化实现方式如下: DiskBlockManager负责管理和维护block和磁盘存储的映射关系,通过blockId作为文件名称,然后如果是多个 ...

  7. 论文中的state-of-the-art

    最近看了几篇计算机顶会和SCI,摘要里经常出现这个词,我以为是什么算法,查阅的知是“当前最高水平”,我记得老师说不能有这种模糊词语,需要表明提高了多少,看来论文都很水,即便是IEEE,SCI.

  8. Redis的安装与idea中的使用

    一.Redis的安装 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开 ...

  9. Matlab与C++混合编程 编写独立外部应用程序时出现“无法定位序数3906于动态链接库LIBEAY32.dll上”错误

    出现“无法定位序数3906于动态链接库LIBEAY32.dll上”错误,这种错误一般是同名函数出现在两个不同的头文件中了. 笔者的这个错误是由于 #include "mat.h" ...

  10. android线程及线程池

    众所周知,在UI系统中进行一些耗时操作,都会导致卡顿现象,因为一次刷新在16ms,如果当次操作过了这个时间,那么用户就能感觉到明显的卡顿,甚至引起ANR . 对于这种情况,一般都是再起一个线程,进行一 ...