上篇:
下篇:
hive 提供的函数,总是不能很贴切的满足我们程序的需要,这时候就需要自定义hive的函数了
hive 函数,大概分为三种:
udf : 一行输入,一行输出
udtf : 一行输入,多行输出
udaf : 多行输入,一行输出,一般在group by中使用group by
不多说,直接开始编写。
1、UDF函数
我们的用户id,使用固定格式,如 000000001、000000002.。。。。。这样递增
在把用户每日数据,写入hbase的时候,设计row key 为:userid_yyyymmdd,这样有一个问题,由于hbase存储是以row key 递增的,
就会导致数据不均衡,随机读写命中率低(hbase读的时候,会吧row key附近的block块都读上来)。
然后,就需要把userid,翻转一下,如下:
100000000 200000000 300000000 400000000 500000000 600000000 700000000 。 。 。
基本这样,在使用hive算数据的时候,就把userid翻转一下,拼上当天的日期,rowkey 就出来了
下面开始编写revert 函数,代码上传到码云:https://gitee.com/SpringMoon-Venn/hivefunction
简单介绍一下:
hive function是个简单的java项目,只加载了两个jar包:hive-exec包和hadoop-common包
<!--hive 2.3.3 最新不会用,退回旧版--> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>1.2.1</version> </dependency> <!--hadoop common--> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency>
上具体代码:
public class RevertString extends UDF { /** * evalute function: use overload 可以重载,自动识别 * @param str * @return */ public String evaluate(String str) { // if string is null or "" if(org.apache.commons.lang.StringUtils.isEmpty(str.trim())){ return ""; } int len = str.length(); char[] chars = new char[len]; // revert string for(int i=0; i < len; i++){ chars[i] = str.charAt(len - i -1); } return new String(chars).toString(); } }
hive UDF函数,主要是继承UDF类,实现 evaluate方法,最后返回的即时转换后的字符串。
由于使用maven做项目管理,直接使用 mvn package,打包,jar包如下:
上传到服务器。
在 $HIVE_HOME/bin 创建.hiverc 文件
添加如下内容:
[hadoop@venn05 bin]$ more .hiverc add jar /opt/hadoop/lib/hivefunction-1.0-SNAPSHOT.jar; create temporary function revert_string as 'com.venn.udf.RevertString';
关闭hive client,重新打开,使用自定义函数:
hive> > select revert_string(userid),userid from sqoop_test limit 10; OK 18185403678 87630458181 77375403678 87630457377 77375403678 87630457377 27175403678 87630457172 75175403678 87630457157 20365403678 87630456302 25555403678 87630455552 25555403678 87630455552 34555403678 87630455543 17545403678 87630454571