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 条评论

发表评论

电子邮件地址不会被公开。