IDEA下写hive的udf(踩坑教程)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IDEA下写hive的udf(踩坑教程)相关的知识,希望对你有一定的参考价值。

参考技术A 配置maven的过程网上有很多这里就不写了。
UDF
用户自定义函数(user defined function)–针对单条记录。
创建函数流程
1、自定义一个Java类
2、继承UDF类
3、重写evaluate方法 (必须重写这个方法)
4、打成jar包
6、在hive执行add jar方法
7、在hive执行创建模板函数
8、hql中使用

打包后的文件在你的项目的target当中,上传那个几kb的original-int2inetaddressUDF-1.0-SNAPSHOT.jar那个文件,上传到服务器上随便一个目录

add jar 你的文件路径 /original-int2inetaddressUDF-1.0-SNAPSHOT.jar;

create temporary function myudf as "UDFDemo.int2inetaddress";

select myudf(XXX) from xxxx

可以参考这里的视频:
http://www.cnblogs.com/simuhunluo/p/7756250.html

Hive如何在源码中添加自定义UDF?

环境: 
hive-1.1.0-cdh5.7.0 包 放在了 /root 下面 
cdh 采用 cdh5.7.0 
目标: 
将自定义函数sayhello  注册到hive 源码中,并且重新编译hive

1、编写UDF 
(1)使用idea+maven,在maven中添加相关参数。 
重要的是 hadoop-common 、hive-exec 、hive-jdbc 
以下为我的maven,文件头修改下,其他可以直接复制后贴入。

 1<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

3<modelVersion>4.0.0</modelVersion>
4<groupId>bigData</groupId>
5<artifactId>hive_train</artifactId>
6<version>1.0</version>
7<packaging>jar</packaging>
8<name>hive_train</name>
9<url>http://maven.apache.org</url>
10<properties>
11<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
12<hadoop.version>2.6.0-cdh5.7.0</hadoop.version>
13<hive.version>1.1.0-cdh5.7.0</hive.version>
14</properties>
15<repositories>
16<repository>
17<id>cloudera</id>
18<url>https://repository.cloudera.com/artifactory/cloudera-repos</url>
19</repository>
20</repositories>
21<!-- 设定插件仓库 -->
22<pluginRepositories>
23<pluginRepository>
24<id>jeesite-repos</id>
25<name>Jeesite Repository</name>
26<url>http://maven.aliyun.com/nexus/content/groups/public</url>
27</pluginRepository>
28</pluginRepositories>
29<dependencies>
30<dependency>
31<groupId>org.apache.hadoop</groupId>
32<artifactId>hadoop-common</artifactId>
33<version>${hadoop.version}</version>
34</dependency>
35<dependency>
36<groupId>org.apache.hive</groupId>
37<artifactId>hive-exec</artifactId>
38<version>${hive.version}</version>
39</dependency>
40<dependency>
41<groupId>org.apache.hive</groupId>
42<artifactId>hive-jdbc</artifactId>
43<version>${hive.version}</version>
44</dependency>
45<dependency>
46<groupId>junit</groupId>
47<artifactId>junit</artifactId>
48<version>4.10</version>
49<scope>test</scope>
50</dependency>
51</dependencies>
52</project>

(2)在maven 生命流程控制中,clean -> build 去下载相关包,网速不好情况下要等一会儿。 没下载完成的话,build会报错。

(3)创建类,并编写一个UDF 名字叫 sayhello.java

1@Description(name = "sayhello",value = "_FUNC_(input_str) - returns Hello : input_str ",
2extended =  "Example:\n "+ "  > SELECT _FUNC_('wxk') FROM src LIMIT 1;\n"+ "  'Hello : wxk'\n")
3public class sayhello extends UDF {
4    public Text evaluate( Text input){
5        return new Text("Hello: "+input);
6  }
7}


2、下载源码 
hive-1.1.0-cdh5.7.0-src.tar.gz 
http://archive.cloudera.com/cdh5/cdh/5/hive-1.1.0-cdh5.7.0-src.tar.gz 
解压后为了方便,放在/root 下面

3、在源码中修改 
(1)添加sayhello.java

1将sayhello.java  放入 /root/hive-1.1.0-cdh5.7.0/ql/src/java/org/apache/hadoop/hive/ql/udf 文件夹中
2vi sayhello.java
3package com.wxkdata.bigdata.hello;
4修改为 package org.apache.hadoop.hive.ql.udf;

(2)修改FunctionRegistry.java 文件

1vi /root/hive-1.1.0-cdh5.7.0/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
2文件头部 一长串 import 下添加,因为我们要吧这个UDF添加进去。
3import org.apache.hadoop.hive.ql.udf.sayhello;
4文件头部 static 块中添加  system.registerUDF("sayhello", sayhello.class, false);
5如下:
6static {
7system.registerGenericUDF("concat", GenericUDFConcat.class);
8system.registerUDF("sayhello", sayhello.class, false);
9system.registerUDF("substr", UDFSubstr.class, false);


然后,查看结果全部为success 
重新编译的包默认为:

/root/hive-1.1.0-cdh5.7.0/packaging/target/apache-hive-1.1.0-cdh5.7.0-bin.tar.gz


4、重新部署或者只将编译后的hive-exec-1.1.0-cdh5.7.0.jar 放到原来hive部署的位置即可。

4.1 在编译后的文件中找到 jar,并将原来的jar 替换。

 1[root@hadoop002 lib]# pwd 
2/root/hive-1.1.0-cdh5.7.0/packaging/target/apache-hive-1.1.0-cdh5.7.0-bin/apache-hive-1.1.0-cdh5.7.0-bin/lib
3[root@hadoop001 lib]# ll hive-exec-1.1.0-cdh5.7.0.jar
4-rw-r--r--. 1 root root 19276386 Sep  5 19:06 hive-exec-1.1.0-cdh5.7.0.jar
5将原来的jar 后缀改掉:
6[root@hadoop002 lib]# mv hive-exec-1.1.0-cdh5.7.0.jar hive-exec-1.1.0-cdh5.7.0.jar.bak
7拷贝到原hive 部署位置:
8[root@hadoop002 lib]# cp hive-exec-1.1.0-cdh5.7.0.jar /opt/software/hive-1.1.0-cdh5.7.0/lib/
9查看
10[root@hadoop002 lib]# ll hive-exec-1.1.0-cdh5.7.0.*
11-rw-r--r-- 1 root root 19276386 Sep 24 19:45 hive-exec-1.1.0-cdh5.7.0.jar
12-rw-r--r-- 1 root root 19272159 Mar 24  2016 hive-exec-1.1.0-cdh5.7.0.jar.bak


4.2 重新解压部署 
(1)配置$HIVE_HOME/conf/hive-env.sh 
添加hadoop home :

1HADOOP_HOME=/opt/software/hadoop-2.6.0-cdh5.7.0


(2)配置$HIVE_HOME/conf/hive-site.xml 最下面几个可以不配,不是必要参数。

 1[root@hadoop002 conf]# cat hive-site.xml
2<?xml version="1.0"?>
3<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
4<configuration>
5<property>
6<name>javax.jdo.option.ConnectionURL</name>
7<value>jdbc:mysql://localhost:3306/hive3?createDatabaseIfNotExist=true</value>
8</property>
9<property>
10<name>javax.jdo.option.ConnectionDriverName</name>
11<value>com.mysql.jdbc.Driver</value>
12</property>
13<property>
14<name>javax.jdo.option.ConnectionUserName</name>
15<value>root</value>
16</property>
17<property>
18<name>javax.jdo.option.ConnectionPassword</name>
19<value>password</value>
20</property>
21<property>  
22<name>hive.support.concurrency</name>  
23<value>true</value>  
24</property>
25<property>  
26<name>hive.enforce.bucketing</name>  
27<value>true</value>  
28</property>
29<property>  
30<name>hive.exec.dynamic.partition.mode</name>  
31<value>nonstrict</value>  
32</property>
33<property>
34<name>hive.txn.manager</name>  
35<value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>  
36</property>
37<property>
38<name>hive.compactor.initiator.on</name>  
39<value>true</value>  
40</property>
41<property>  
42<name>hive.in.test</name>  
43<value>true</value>  
44</property>
45<property>
46<name>hive.cli.print.current.db</name>
47<value>true</value>
48</property>
49</configuration>


(3) 将 mysql jdbc 拷贝到 $HIVE_HOME/lib 下 ,因为编译的时候默认不带这个jdbc

cp mysql-connector-java-5.1.27-bin.jar $HIVE_HOME/lib 


5、测试

 1hive (default)> show functions ;
2hive (default)>desc function extended sayhello;
3OK
4sayhello(input_str) - returns Hello : input_str
5Example:
6   > SELECT sayhello('wxk') FROM src LIMIT 1
;
7'Hello : wxk'
8Time taken: 0.024 seconds, Fetched: 5 row(s)
9hive (default)> select from emp;
10OK
11SMITH   Hello: SMITH
12ALLEN   Hello: ALLEN
13WARD    Hello: WARD
14JONES   Hello: JONES
15MARTIN  Hello: MARTIN
16BLAKE   Hello: BLAKE
17CLARK   Hello: CLARK
18SCOTT   Hello: SCOTT
19KING    Hello: KING
20TURNER  Hello: TURNER
21ADAMS   Hello: ADAMS
22JAMES   Hello: JAMES
23FORD    Hello: FORD
24MILLER  Hello: MILLER
25HIVE    Hello: HIVE


结果正确,我们的UDF 相当于直接注册到Hive中,当做hive的一个默认函数了。 



还不赶快来学习!等啥呢!

预售课程


以上是关于IDEA下写hive的udf(踩坑教程)的主要内容,如果未能解决你的问题,请参考以下文章

Intellij IDEA下载安装教程和搭建springboot开发环境及踩坑指南(超详细图文教程)

hive 踩坑

HIVE踩坑——NULL和空字符串处理

大数据线上问题排查系列 - HIVE 踩坑记

大数据问题排查系列 - HIVE踩坑记

idea用jdbc连接mysql踩坑