Hive中创建UDF
UDF是用户自定义函数。具体见《Hive编程指南》第13.10节。
创建过程如下
1. 编写java代码
首先继承 org.apache.hadoop.hive.ql.exec.UDF
类,并实现一个名为 evaluate
的方法,在该方法中写你的自定义函数具体实现的代码,evaluate
函数的参数和返回值可以自定义,还可以重载。 不过必须是可以被 hadoop 序列化的类型譬如 Text(具体哪些?)
下面是一个示例,实现了 evaluate 函数,接受一个参数,总是返回一个字符串 “This is a test”
Test.java
package com.padeoe.hive.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
/**
* Created by padeoe on 2016/7/14.
*/
public class Test extends UDF {
public Text evaluate(Text input) {
Text to_value = new Text("");
to_value.set("This is a test!");
return to_value;
}
}
2. jar打包
Hive 需要加载 jar,获取其中的自定义函数。对 Test.java 进行打包。
因为依赖于 org.apache.hadoop.hive.ql.exec.UDF
以及 org.apache.hadoop.io.Text
这两个类, 编译时必须要将这两个类加入到 classpath 中才可以编译,包含这两个类的 jar 可以在 Hive 及 Hadoop 的目录中找到,hadoop-common.jar和 hive-exec.jar。 如果没有找到或是在开发机器上编程,可以从maven中找到hadoop-common.jar 和hive-exec.jar
编译
Linux
javac -classpath /usr/lib/hadoop/hadoop-common-2.7.2-amzn-2.jar:/usr/lib/hive/lib/hive-exec-1.0.0-amzn-5.jar Test.java
Windows
javac -classpath E:\hadoop-common-2.7.1.jar;E:\lib\hive-exec-2.1.0.jar Test.java
打包
jar -cvf Output.jar ./*.class
获得了 Output.jar
3.在Hive中注册UDF
$ hive
hive> ADD jar /home/hadoop/Output.jar
hive> LIST jars; -- 查看当前加载的jar
hive> CREATE FUNCTION function_name_test as 'com.padeoe.hive.udf.Test' USING jar 'Output.jar'; #创建函数
hive> SELECT function_name_test(column_name) from databasename1.table_name limit 1; #使用函数
This is a test!
hive> exit;
常见问题
- SemanticException Invalid function
hive> use databasename2; -- 切换database
hive> select function_name_test(column_name) from databasename1.table_name;
FAILED: SemanticException [Error 10011]: Line 1:7 Invalid function 'function_name_test'
是因为 Hive 0.13 之后函数注册与注册时的当前database绑定了,需要使用全名database.table_name才能引用到该函数。
hive> use databasename2; -- 切换database
hive> select databasename1.function_name_test(column_name) from databasename1.table_name;
This is a test!
共有 0 条评论