一.临时函数
- idea编写udf
- 打包
Maven Projects —->Lifecycle —->package —-> 右击 Run Maven Build - rz上传至服务器
- 添加jar包
hive>add xxx.jar jar_filepath; - 查看jar包
hive>list jars; - 创建临时函数
hive>create temporary function my_lower as ‘com.example.hive.udf.Lower’;
二.持久函数
- idea编写udf
- 打包
Maven Projects —->Lifecycle —->package —-> 右击 Run Maven Build - rz上传至服务器
- 上传到HDFS
$ hdfs dfs -put xxx.jar hdfs:///path/to/xxx.jar - 创建持久函数
hive>CREATE FUNCTION myfunc AS ‘myclass’ USING JAR ‘hdfs:///path/to/xxx.jar’;
注意点:
- 此方法在show functions时是看不到的,但是可以使用
- 需要上传至hdfs
三.持久函数,并注册
环境介绍:CentOS7+hive-1.1.0-cdh5.7.0+Maven3.3.9
下载源码
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解压源码
tar -zxvf hive-1.1.0-cdh5.7.0-src.tar.gz -C /home/hadoop/
cd /home/hadoop/hive-1.1.0-cdh5.7.0将HelloUDF.java文件增加到HIVE源码中
cp HelloUDF.java /home/hadoop/hive-1.1.0-cdh5.7.0/ql/src/java/org/apache/hadoop/hive/ql/udf/修改FunctionRegistry.java 文件
1
2
3
4cd /home/hadoop/hive-1.1.0-cdh5.7.0/ql/src/java/org/apache/hadoop/hive/ql/exec/
vi FunctionRegistry.java
在import中增加:import org.apache.hadoop.hive.ql.udf.HelloUDF;
在文件头部 static 块中添加:system.registerUDF("helloUDF", HelloUDF.class, false);重新编译
cd /home/hadoop/hive-1.1.0-cdh5.7.0
mvn clean package -DskipTests -Phadoop-2 -Pdist编译结果全部为:BUILD SUCCESS
文件所在目录:/home/hadoop/hive-1.1.0-cdh5.7.0/hive-1.1.0-cdh5.7.0/packaging/target配置hive环境
配置hive环境时,可以全新配置或将编译后带UDF函数的包复制到旧hive环境中:
7.1. 全部配置:参照之前文档 Hive全网最详细的编译及部署7.2. 将编译后带UDF函数的包复制到旧hive环境
到/home/hadoop/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下,找到hive-exec-1.1.0-cdh5.7.0.jar包,并将旧环境中对照的包替换掉
命令:1
2
3
4cd /home/hadoop/app/hive-1.1.0-cdh5.7.0/lib
mv hive-exec-1.1.0-cdh5.7.0.jar hive-exec-1.1.0-cdh5.7.0.jar_bak
cd /home/hadoop/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
cp hive-exec-1.1.0-cdh5.7.0.jar /home/hadoop/app/hive-1.1.0-cdh5.7.0/lib最终启动hive
测试:
1
2
3hive
hive (default)> show functions ; -- 能查看到有 helloudf
hive(default)>select deptno,dname,helloudf(dname) from dept; -- helloudf函数生效