Hive UDF 第一篇:怎么实现自己的 hive 自定义函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive UDF 第一篇:怎么实现自己的 hive 自定义函数相关的知识,希望对你有一定的参考价值。
参考技术A看到这篇文章的同学相信都是 大数据相关技术爱好者 、从业人员或者业界大佬。这篇文章篇基础,属于上手性指引,如有不对的地方欢迎指正
文章的源代码github地址在文末
为什么要有 UDF
纵然 内置函数(Build-in Function)再丰富,也会遇到 无法完全满足我们特定场景的需要,这时我们需要 UDF;或者我们通过内置函数可以实现,但是业务代码冗长,又或者业务代码不仅冗长而且可能要多处维护,那么这时候我们需要 UDF。
强如 Oracle 这一霸占传统金融行业大部分数据库份额的厂商,一样提供 用户自定义函数的接口,Hive 这一开源生态的神级项目,自然也不会少。
总之:UDF 就是为灵活性而存在,为可扩展性而存在
选择合适的 UDF
按照不同使用场景需要, Hive 已经为我们将 UDF 归为3类,分别对应3种不同使用场景
1. 转换函数 UDF :适用于行级别转换操作,数据行中的一列后者几列,生成一列或者几列,效果可参照 内置函数的 upper() 讲一列的字符串所有字符 统一转换为 大写字符;
2. 聚合函数 UDAF: 适用与多行进行聚合成一行,或者多行分组聚合成相对小的多行,效果参照 内置函数 sum() ,一般配合 group by 使用较多
3. 表生成函数 UDTF: 适用一行生成多行场景 ,效果参照 内置函数 explode()
实现你的 UDF 逻辑
1. 转换函数UDF 实现 :
以前在 Oracle 上使用 decode 做 枚举型值转译用得方便,到 hive 上了 没有这么方便的函数,只能用 case when 或者 if 这种相对繁琐,代码行数偏大
为实现这个UDF,我们需要继承Hive相应类,实现3个函数
1. 第一个函数,初始化:这里做2个事情
1> 检查传入字段的合法性,我这里函数使用时传入参数必须是大于等于4个的 偶数,参照 oracle decode
2> 我这里返回的是 字符串类型(如果你在这里有疑问:为什么返回字符串要这样做, 我在第二篇中努力讲清楚)
如果有些需要共享连接之类资源的场景,也可以在这里做,这个方法是 每生成一个 mapper对象 执行一次,也可以理解: MR 中 每个 parttion 才执行一次 ,我在实际工作中有一个 需要远端解密的场景就用到了
2. 第二个函数,是真正转换函数
3. 第三个函数,hive收集元数据信息的函数
2. 聚合函数 UDAF实现:
抱歉,我并没有合适的公开的 案例代码直接贴出来,后面有合适的
3. 表生成函数 UDTF 实现:
表生成函数有很多使用场景,我这直接上我的实例:我们在 实际数据仓库研发中,对缓慢变化维度 经常使用 拉链表 来实现;而在 hive 中是不支持 不等值条件写在 on 条件里 ,只能通过 where 子句实现,但 where 子句明显是过程中产生 笛卡尔积 的做法,
为规避这个情况 写了一个通用的 日粒度拉链表 爆炸展开的 函数, 我们在 与事实表连接时 将很方便地实现 等值连接,也方便 HIve 或者 Spark 的 执行计划 优化,避免全量的shulffe,等值join 会方便 按连接键分区
实现UDTF 需要继承 相应类,实现 3个函数
1. 第一个函数,初始化:所做事情参照 UDF
2. 第二个函数,循环生成记录并 通过 forward 函数输出
3. 第三个函数,关闭函数,按需使用
我这里什么都没做
注册UDF 函数
临时 UDF,当前会话
永久且全局 UDF
这样做之后,会在 hive 的元数据库中查到函数的信息,若遇到 跨 session 无法使用,可选择 在相应的 session 中做函数重载
全局 UDF 不仅可在 Hive 中使用,亦可在 spark sql 中使用 ,hive 的 hiveserver2 的其他 jdbc/odbc 连接中使用
[这篇文章完整代码在我的 github 上开源项目中,其中包含 类decode/日期转 星座 /IPv4与整数互转 以及适用 拉链表爆炸展开的表生成函数](https://github.com/Jiafan/hudf)
参考
为了进一步学习 和使用 UDF相关的功能,可以参考 官方文档 和 Clouder 文档
[Hive官方文档-UDF](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-Built-inOperators)
[Cloudera的关于Hive UDF 的文档](https://docs.cloudera.com/HDPDocuments/HDP3/HDP-3.0.0/using-hiveql/content/hive_create_udf.html)
下一篇
Hive UDF 第二篇:实现UDF为什么要实现这几个方法
[源代码仓库](https://github.com/Jiafan/hudf.git)
Hive 如何实现自定义函数 UDF
1. 概述
当 Hive 提供的内置函数无法满足你的业务处理需要时,此时可以考虑使用用户自定义函数 UDF 来满足不同的计算需求。UDF 在使用上与普通的内建函数类似。
2. 依赖
开发 Hive UDF 之前,我们需要引入如下依赖,里面定义了各种我们自定义 UDF 函数的类型:UDF、GenericUDF、GenericUDTF:
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec
以上是关于Hive UDF 第一篇:怎么实现自己的 hive 自定义函数的主要内容,如果未能解决你的问题,请参考以下文章