HiveUDF第一篇怎么实现自己的hive自定义函数
看到这篇文章的同学相信都是大数据相关技术爱好者、从业人员或者业界大佬。这篇文章篇基础,属于上手性指引,如有不对的地方欢迎指正
文章的源代码github地址在文末
为什么要有UDF
纵然内置函数(BuildinFunction)再丰富,也会遇到无法完全满足我们特定场景的需要,这时我们需要UDF;或者我们通过内置函数可以实现,但是业务代码冗长,又或者业务代码不仅冗长而且可能要多处维护,那么这时候我们需要UDF。
强如Oracle这一霸占传统金融行业大部分数据库份额的厂商,一样提供用户自定义函数的接口,Hive这一开源生态的神级项目,自然也不会少。
总之:UDF就是为灵活性而存在,为可扩展性而存在
选择合适的UDF
按照不同使用场景需要,Hive已经为我们将UDF归为3类,分别对应3种不同使用场景
1。转换函数UDF:适用于行级别转换操作,数据行中的一列后者几列,生成一列或者几列,效果可参照内置函数的upper()讲一列的字符串所有字符统一转换为大写字符;
2。聚合函数UDAF:适用与多行进行聚合成一行,或者多行分组聚合成相对小的多行,效果参照内置函数sum(),一般配合groupby使用较多
3。表生成函数UDTF:适用一行生成多行场景,效果参照内置函数explode()
实现你的UDF逻辑
1。转换函数UDF实现:
以前在Oracle上使用decode做枚举型值转译用得方便,到hive上了没有这么方便的函数,只能用casewhen或者if这种相对繁琐,代码行数偏大
为实现这个UDF,我们需要继承Hive相应类,实现3个函数
1。第一个函数,初始化:这里做2个事情
1检查传入字段的合法性,我这里函数使用时传入参数必须是大于等于4个的偶数,参照oracledecode
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,当前会话CREATEtemporaryFUNCTIONmedcodeAStech。jiafan。udf。MDecodeUSINGJARhdfs:pathtoudfyourpackage。jar;
永久且全局UDFCREATEFUNCTIONmedcodeAStech。jiafan。udf。MDecodeUSINGJARhdfs:pathtoudfyourpackage。jar;
这样做之后,会在hive的元数据库中查到函数的信息,若遇到跨session无法使用,可选择在相应的session中做函数重载
reloadfunction;
全局UDF不仅可在Hive中使用,亦可在sparksql中使用,hive的hiveserver2的其他jdbcodbc连接中使用
〔这篇文章完整代码在我的github上开源项目中,其中包含类decode日期转星座IPv4与整数互转以及适用拉链表爆炸展开的表生成函数〕(https:github。comJiafanhudf)
参考
为了进一步学习和使用UDF相关的功能,可以参考官方文档和Clouder文档
〔Hive官方文档UDF〕(https:cwiki。apache。orgconfluencedisplayHiveLanguageManualUDFLanguageManualUDFBuiltinOperators)
〔Cloudera的关于HiveUDF的文档〕(https:docs。cloudera。comHDPDocumentsHDP3HDP3。0。0usinghiveqlcontenthivecreateudf。html)
下一篇
HiveUDF第二篇:实现UDF为什么要实现这几个方法
〔源代码仓库〕(https:github。comJiafanhudf。git)