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 自定义函数的主要内容,如果未能解决你的问题,请参考以下文章

Hive3.1.2自带的系统函数及UDF的随系统自动注册

Hive3.1.2自带的系统函数及UDF的随系统自动注册

Hive开发自定义函数UDF

Hive自定义UDF函数

如何写hive的udf函数

hive自定义UDF函数,步骤详解