前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python实现MaxCompute UDF/UDAF/UDTF

Python实现MaxCompute UDF/UDAF/UDTF

作者头像
企鹅号小编
发布2018-02-02 15:38:07
2.8K0
发布2018-02-02 15:38:07
举报
文章被收录于专栏:编程

MaxCompute的UDF包括:UDF,UDAF和UDTF三种函数,本文将重点介绍如何通过Python实现这三种函数。

参数与返回值类型

参数与返回值通过如下方式指定:

PythonUDF目前支持ODPSSQL数据类型有:bigint,string,double,boolean和datetime。SQL语句在执行之前,所有函数的参数类型和返回值类型必须确定。因此对于Python这一动态类型语言,需要通过对UDF类加decorator的方式指定函数签名。

函数签名signature通过字符串指定,语法如下:

arg_type_list'->'type_list

arg_type_list:type_list|'*'|''

type_list:[type_list',']type

type:'bigint'|'string'|'double'|'boolean'|'datetime'

·箭头左边表示参数类型,右边表示返回值类型。

·只有UDTF的返回值可以是多列,UDF和UDAF只能返回一列。

·‘*’代表变长参数,使用变长参数,UDF/UDTF/UDAF可以匹配任意输入参数。

下面是合法的signature的例子:

'bigint,double->string'#参数为bigint、double,返回值为string

'bigint,boolean->string,datetime'#UDTF参数为bigint、boolean,返回值为string,datetime

'*->string'#变长参数,输入参数任意,返回值为string

'->double'#参数为空,返回值为double

Query语义解析阶段会将检查到不符合函数签名的用法,抛出错误禁止执行。执行期,UDF函数的参数会以函数签名指定的类型传给用户。用户的返回值类型也要与函数签名指定的类型一致,否则检查到类型不匹配时也会报错。ODPSSQL数据类型对应Python类型如下:

注解:

·Datetime类型是以int的形式传给用户代码的,值为epochutctime起始至今的毫秒数。用户可以通过Python标准库中的datetime模块处理日期时间类型。

·NULL值对应Python里的None。

UDF

实现PythonUDF非常简单,只需要定义一个new-styleclass,并实现evaluate方法。下面是一个例子:

注解:PythonUDF必须通过annotate指定函数签名。

UDAF

·classodps.udf.BaseUDAF:继承此类实现PythonUDAF。

·BaseUDAF.new_buffer():实现此方法返回聚合函数的中间值的buffer。buffer必须是mutableobject(比如list,dict),并且buffer的大小不应该随数据量递增,在极限情况下,buffermarshal过后的大小不应该超过2Mb。

·BaseUDAF.iterate(buffer[,args,...]):实现此方法将args聚合到中间值buffer中。

·BaseUDAF.merge(buffer,pbuffer):实现此方法将两个中间值buffer聚合到一起,即将pbuffermerge到buffer中。

·BaseUDAF.terminate(buffer):实现此方法将中间值buffer转换为ODPSSQL基本类型。

下面是一个UDAF求平均值的例子。

UDTF

·classodps.udf.BaseUDTF:PythonUDTF的基类,用户继承此类,并实现process,close等方法。

·BaseUDTF.init():初始化方法,继承类如果实现这个方法,则必须在一开始调用基类的初始化方法super(BaseUDTF,self).init()。init方法在整个UDTF生命周期中只会被调用一次,即在处理第一条记录之前。当UDTF需要保存内部状态时,可以在这个方法中初始化所有状态。

·BaseUDTF.process([args,...]):这个方法由ODPSSQL框架调用,SQL中每一条记录都会对应调用一次process,process的参数为SQL语句中指定的UDTF输入参数。

·BaseUDTF.forward([args,...]):UDTF的输出方法,此方法由用户代码调用。每调用一次forward,就会输出一条记录。forward的参数为SQL语句中指定的UDTF的输出参数。

·BaseUDTF.close():UDTF的结束方法,此方法由ODPSSQL框架调用,并且只会被调用一次,即在处理完最后一条记录之后。

下面是一个UDTF的例子。

注解:PythonUDTF也可以不加annotate指定参数类型和返回值类型。这样,函数在SQL中使用时可以匹配任意输入参数,但返回值类型无法推导,所有输出参数都将认为是string类型。因此在调用forward时,就必须将所有输出值转成str类型。

引用资源

PythonUDF可以通过odps.distcache模块引用资源文件,目前支持引用文件资源和表资源。

o返回指定名字的资源内容。resource_name为str类型,对应当前Project中已存在的资源名。如果资源名非法或者没有相应的资源,会抛出异常。

o返回值为file-likeobject,在使用完这个object后,调用者有义务调用close方法释放打开的资源文件。

下面是使用get_cache_file的例子:

o返回指定资源表的内容。resource_name为str类型,对应当前Project中已存在的资源表名。如果资源名非法或者没有相应的资源,会抛出异常。

o返回值为generator类型,调用者通过遍历获取表的内容,每次遍历得到的是以tuple形式存在的表中的一条记录。

下面是使用get_cache_table的例子:

更多Python语言测试,请前往51Testing软件测试网。

本文来自企鹅号 - 51软件测试网媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文来自企鹅号 - 51软件测试网媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档