首页 > 其他 > 详细

Struct复杂数据类型的UDF编写、GenericUDF编写

时间:2019-12-26 16:45:41      阅读:91      评论:0      收藏:0      [点我收藏+]

一、背景介绍:

MaxCompute 2.0版本升级后,Java UDF支持的数据类型从原来的BIGINT、STRING、DOUBLE、BOOLEAN扩展了更多基本的数据类型,同时还扩展支持了ARRAY、MAP、STRUCT等复杂类型,以及Writable参数。Java UDF使用复杂数据类型的方法,STRUCT对应com.aliyun.odps.data.Struct。com.aliyun.odps.data.Struct从反射看不出Field Name和Field Type,所以需要用@Resolve注解来辅助。即如果需要在UDF中使用STRUCT,要求在UDF Class上也标注上@Resolve注解。但是当我们Struct类型中的field有很多字段的时候,这个时候需要我们去手动的添加@Resolve注解就不是那么的友好。针对这一个问题,我们可以使用Hive 中的GenericUDF去实现。MaxCompute 2.0支持Hive风格的UDF,部分Hive UDF、UDTF可以直接在MaxCompute上使用。

二、复杂数据类型UDF示例

示例定义了一个有三个复杂数据类型的UDF,其中第一个用ARRAY作为参数,第二个用MAP作为参数,第三个用STRUCT作为参数。由于第三个Overloads用了STRUCT作为参数或者返回值,因此要求必须对UDF Class添加@Resolve注解,指定STRUCT的具体类型。

1.代码编写

技术分享图片

2.打jar包添加资源

技术分享图片

3.创建函数

技术分享图片

4.使用UDF函数

技术分享图片

三、使用Hive的GenericUDF

这里我们使用Struct复杂数据类型作为示例,主要处理的逻辑是当我们结构体中两个字段前后没有差异时不返回,如果前后有差异将新的字段及其值组成新的结构体返回。示例中Struct的Field为3个。使用GenericUDF方式可以解决需要手动添加@Resolve注解。

1.创建一个MaxCompute表

技术分享图片

2.表中数据结构如下

技术分享图片

查询数据如下所示:

技术分享图片

3.编写GenericUDF处理逻辑

(1)QSC_DEMOO类

技术分享图片

(2)PubSimpleStruct类

技术分享图片

3、打jar包,添加资源

技术分享图片

4、创建函数

技术分享图片

5、测试使用UDF函数

技术分享图片

查询结果如下所示:

技术分享图片

注意:
(1)在使用兼容的Hive UDF的时候,需要在SQL前加set odps.sql.hive.compatible=true;语句,set语句和SQL语句一起提交执行。

(2)目前支持兼容的Hive版本为2.1.0,对应Hadoop版本为2.7.2。如果UDF是在其他版本的Hive/Hadoop开发的,则可能需要使用此Hive/Hadoop版本重新编译。

技术分享图片

 

本文作者:刘-建伟 

原文链接

本文为阿里云内容,未经允许不得转载。

Struct复杂数据类型的UDF编写、GenericUDF编写

原文:https://www.cnblogs.com/zhaowei121/p/12102397.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!