之前帮业务方固化过hive-0.7的自定义的UDF,由于现在大部分业务数据都已经迁移到hadoop2.4.0,hive使用的版本是0.13,之前固化的UDF不能用了,让在0.13上面也固化一下,以下是固化过程:
1、常用的自定义函数有:mid,url_to_mid ,row_number ,,findid ,nvl
2、udf包:hive-udf-1.0.jar
3、将hive-udf-1.0.jar包作为编译hive-exec依赖的方式有以下两种,选择其中一种就行:
(1)、将hive-udf-1.0.jar打进maven本地库,hive从本地maven库获取
修改hive/ql下面的pom.xml文件,增加以下内容
<dependency>
<version>1.0</version>
<optional>true</optional>
</dependency>
(2)、mavn打包的时候使用scop为system,指定包路径
<dependency>
<groupId>com.sina.dw</groupId>
<artifactId>hive-udf</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${LOCAL_JAR_PATH}/hive-udf-1.0.jar</systemPath>
</dependency>
4、修改hive类
hive-0.13.0/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
增加以下内容:
import dw.udf.FindId;
import dw.udf.UrlToMid;
import dw.udf.mid;
static {
registerUDF("url_to_mid”,UrlToMid.class, false);
registerUDF("mid",mid.class, false);
registerUDF("findid”,FindId.class ,false);
}
5、打包生成hive-exec-0.13.0.jar
cd hive-0.13.0/ql/
执行:
mvn package -DskipTests -Phadoop-2
6、拷贝包修改配置文件
(1)、将生成的包hive-exec-0.13.0.jar拷贝到$HADOOP_HOME/share/hadoop/common/lib目录下
(2)、拷贝hive-udf-1.0.jar到$HIVE_HOME/lib目录下
(3)、修改hive配置文件hive-site.xml,修改配置项hive.aux.jars.path
<property>
<name>hive.aux.jars.path</name>
<value>file:///***.jar,file:///***/hive-0.13.0/lib/hive_udf.jar</value>
</property>
注意:在我的环境下必须把hive-exec-0.13.0.jar放到hadoop下面,放到$HIVE_HOME/lib下不生效,这个问题是从执行hive命令时,提示信息知道的:
hive
Logging initialized using configuration in jar:file:$HADOOP_HOME/share/hadoop/common/lib/hive-exec-0.13.0.jar!/hive-log4j.properties
hive>
7、测试
查询mid转url
查询mid
selecturl_to_mid(‘z62QS3Ghr’,’1′,’0′)fromdual
博文中短链点击次数查询:
selectt1.uid,count(1)fromhue_lilin4_midt1joinf_tblog_behaviorbont1.uid=findid(b.extend,’mid’)andb.dt>=’2012-07-21’andb.dt<=’2012-08-12’andb.behavior=’14000014’groupbyt1.uid
8、一切ok,over!
踮起脚尖,我们就能离幸福更近点吗?