自定义hive永久函数详细步骤
来源:互联网 发布:java web gzip 编辑:程序博客网 时间:2024/05/04 11:04
需求原因:
本公司有部门需要,Hive本身提供一个nvl的函数,但是该函数只对null值起作用,现在的需求是不只是对null起作用,对“”这样的空值也要起作用,所以需要自定义一个名叫nvls的函数,并集成到hive当中去。
具体步骤:
1:先写好Java文件内容如下:
package org.apache.Hadoop.hive.ql.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
public class MyNvl extends UDF {
public Text evaluate(final Text t,final Text x) {
if(t!=null){
if(t.toString().equals("")){
return x;
}
}else{
return x;
}
return t;
}
}
2:测试:
2.1:先打成jar包名叫lixiyuan.jar,然后上传到服务器上。本人账户是zb_test。
Jar包放到/data/zb_test目录下。
然后进入hive
选测试的数据库:
Use test
然后添加jar包
Add jar /data/zb_test/lixiyuan.jar
然后创建函数
Create temporary function nvls as ‘org.apahce.hadoop.hive.ql.udf.MyNvl’;
然后就可以测试了
测试成功以后我们就要把集成到hive中去。
3:把函数集成到hive中去
先说一下添加永久函数的思路:首先hive里的函数是跟hive-exec-0.12.0-cdh5.0.0.jar个jar包有关的
具体的说就是我们要做两件事:
1:先修改环境变量vi ./.bashrc。内容修改为为如下:
把CLASSPATH改成如下:
export CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$SQOOP_HOME/lib:/opt/boh-2.0.0/hadoop/share/hadoop/tools/lib/*:/opt/boh-2.0.0/hadoop/share/hadoop/common/lib/*:/opt/boh-2.0.0/hadoop/share/hadoop/common/*:/opt/boh-2.0.0/hive/li
(为一行)
把刚刚写的java文件编译成class文件,然后添加到hive-exec-0.12.0-cdh5.0.0.jar解压后的udf目录下
2:修改hive-exec-0.12.0-cdh5.0.0.jar里的exec目录下的FunctionRegistry文件,但是我们解压出来的是都人家编译好的,所以得需要我们找到源码,找到FunctionRegistry.java文件后,往里面添加:
import org.apache.hadoop.hive.ql.udf.MyNvl;
registerUDF(“nvls”, MyNvl.class,false);
完成这两个步骤就可以了。
但是问题来了:
完成第一个步骤是简单的,完成第二个步骤就复杂一点了,因为咱们修改了FunctionRegistry.java文件后得编译成class文件以后才能用来替换原来的FunctionRegistry.class文件。所以现在解决的是怎么编译FunctionRegistry.java文件。
3:如何编译FunctionRegistry.java文件:
因为FunctionRegistry.java里面有:import org.apache.hadoop.hive.ql.udf.MyNvl;
registerUDF(“nvls”, MyNvl.class,false);这样的信息。
所以我们先把刚刚先新建这样的一个目录:
Org/apache/hadoop/hive/ql/udf然后往里面放MyNvl.class文件。
然后把这个org的目录打成jar包。名叫hello.jar
Jar -cvf /data/zb_test/hello.jar /data/zb_test/org/
接着,修改环境变量:
把CLASSPATH改成如下:
export CLASSPATH=/data/zb_test/hello.jar:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$SQOOP_HOME/lib:/opt/boh-2.0.0/hadoop/share/hadoop/tools/lib/*:/opt/boh-2.0.0/hadoop/share/hadoop/common/lib/*:/opt/boh-2.0.0/hadoop/share/hadoop/common/*:/opt/boh-2.0.0/hive/li
然后这样就可以编译FunctionRegistry.java文件了
Javac ./FunctionRegistry.java
然后用生成的FunctionRegistry.class文件替换原来的文件。然后重新把解压的东西打包成:
hive-exec-0.12.0-cdh5.0.0.jar替换hive里原来的就ok了。
搞定,手工!
- 自定义hive永久函数详细步骤
- 自定义hive永久函数详细步骤
- spark sql hive自定义函数(永久函数)
- HIVE中的自定义函数(临时函数和永久函数)
- 自定义UDTF和hive自定义函数的永久注册
- hive 永久udf函数
- Hive永久函数
- hive 永久udf函数
- Hive永久UDF依赖包问题以及几个日期相关的自定义函数
- Hive中实现自定义函数UDF详细过程
- 自定义-Hive自定义函数
- Hive 自定义函数函数
- Hive 自定义函数函数
- 自定义UITableViewCell详细步骤
- 自定义UITableViewCell详细步骤+++++++++++++++
- HIVE中的自定义函数
- hive用户自定义函数
- HIVE中的自定义函数 .
- [李景山php]每天TP5-20170127|thinkphp5-View.php
- 图的m着色问题
- MySQL 大表优化方案
- poj 3415 Common Substrings (后缀数组+单调栈)
- Mac OS X 用终端破解附近 Wifi 密码教程
- 自定义hive永久函数详细步骤
- 什么是面向对象的javaScript(二)——创建对象
- JS组件系列——BootstrapTable 行内编辑解决方案:x-editable
- Oracle数据库中的本地索引和全局索引的区别
- OGG-00446的解决方法
- Mongo DB增删改查命令_MongoDB
- React-Native之最基础
- mybatis中_parameter使用和常用sql
- Xcode创建的工程使用xcodebuild命令行编译