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
3将 package 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(踩坑教程)的主要内容,如果未能解决你的问题,请参考以下文章