Hive发展至今,自身已经很是成熟了,可是为了灵活性,仍是提供了各类各样的 插件的方式,只有你想不到的,没有作不到的,主流的开源框架都有相似的机制,包括Hadoop,Solr,Hbase,ElasticSearch,这也是面向抽象编程的好处,很是容易扩展。java
最近在使用hive1.2.0的版本,由于要给有一列的数据生成md5签名,便于查重数据使用,看了下hive的官网文档发现是支持的,后来在Hue里面试了下,发现不支持,还觉得是Hue的问题因而在后台hive命令行里面试了下,发现一样不支持,官网的文档应该是Hive2.x的了因此不支持也有可能,但也不必为了使用个md5函数就把hive升级到最新版本,那样有点本末倒置,那就写个UDF解决吧,之前写过Pig的UDF,很是简单,Hive的应该也不会太难,看了官网文档,果真很是easy,下面看下步骤:python
注意,这里用的是maven项目,只须要引入hive-exec包便可:linux
<dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>1.2.1</version> <scope>provided</scope> </dependency>
evaluate方法并非重写的方法,而是一个新的方法,Pig里面是须要重写exec方法,来完成自定义逻辑的,代码以下:面试
package com.easy.md5; import com.google.common.base.Strings; import com.google.common.hash.Hashing; import org.apache.hadoop.hive.ql.exec.UDF; /** * Created by qindongliang on 2016/5/23. * Hive自定义UDF,计算md5值 */ public class MD5 extends UDF { /** * @param s 传入参数 * @return md5值 */ public String evaluate(final String s) { if(Strings.isNullOrEmpty(s.trim())){ return null; } return Hashing.md5().hashString(s.trim()).toString(); } }
程序完成后,打包成jar,而后上传到对应的机器上,开始注册本身的UDF函数,这里有两种方式:算法
A:临时注册sql
执行hive命令,进入终端:shell
add jar /home/hive/udfs/hive-md5-guava-1.0.0.jar; create temporary function md5 as 'com.easy.md5.MD5'; select md5('hadoop'); --结果: 3abb766da6c2c2d7739f3cb7799a4caa
B:永久注册(hive0.13以后支持)apache
在linux上,上传jar包至HDFS中编程
hadoop fs -put hive-md5-guava-1.0.0.jar /user/tez/
进入hive终端框架
CREATE FUNCTION md5 AS 'com.easy.md5.MD5' USING JAR 'hdfs:///user/tez/hive-md5-guava-1.0.0.jar' ; select md5('hadoop'); --结果: 3abb766da6c2c2d7739f3cb7799a4caa --删除临时函数 DROP TEMPORARY FUNCTION [IF EXISTS] function_name; --删除永久函数 DROP FUNCTION [IF EXISTS] function_name; --从新加载函数 hive1.2.0以后支持 RELOAD FUNCTION;
这样就不用每次打开终端都须要注册了
Hue是一款基于Web可视化提交任务的框架,由python编写,若是想要在hue中,使用自定义的UDF函数,须要稍做配置,不然使用过程当中可能会报错,即便你在服务端已经注册过了。