如何自定义hive永久函数

这篇文章给大家分享的是有关如何自定义hive永久函数的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

创新互联是一家集网站建设,丰镇企业网站建设,丰镇品牌网站建设,网站定制,丰镇网站建设报价,网络营销,网络优化,丰镇网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

需求原因:

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-cdh6.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-cdh6.0.0.jar解压后的udf目录下

2:修改hive-exec-0.12.0-cdh6.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-cdh6.0.0.jar替换hive里原来的就ok了。

感谢各位的阅读!关于“如何自定义hive永久函数”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!


网站题目:如何自定义hive永久函数
本文路径:http://scyanting.com/article/jjchgo.html