On this page
Hive 插件开发人员套件
本页说明 Apache Hive 的插件开发套件或 PDK。这使开发人员无需构建 Hive 源代码构建即可构建和测试 Hive 插件。只需要一个 Hive 二进制发行版。
计划将 PDK 包含在 Hive 0.8.0 版本中。直到可用为止,请从Jenkins下载最新的快照版本;确保它包含HIVE-2244。
当前,PDK 仅针对用户定义的功能(包括 UDAF 和 UDTF),尽管可以将其用于构建其他类型的插件,例如 Serdes,Importing/输出格式,存储处理程序和索引处理程序。 PDK 的测试框架当前仅支持 UDF 的自动化测试。
Example Plugin
为了演示 PDK 的运行情况,Hive 发行版包含一个examples/test-plugin
目录。您可以通过转到该目录并运行来构建测试插件
ant -Dhive.install.dir=../..
这将创建一个包含已编译插件pdk-test-udf-0.1.jar
的build
子目录。还有一个build/metadata
目录,其中包含add-jar.sql
(演示用于加载插件 jar 的命令)和class-registration.sql
(演示用于从插件加载 UDF 的命令)。可以通过 Hive CLI 的-i
命令行参数传递.sql 文件,以便作为初始化脚本运行。
您可以通过运行与插件关联的测试
ant -Dhive.install.dir=../.. test
如果一切顺利,您应该会看到类似以下的输出
Buildfile: /hive-0.8.0-SNAPSHOT/examples/test-plugin/build.xml
get-class-list:
test:
[junit] Running org.apache.hive.pdk.PluginTest
[junit] Tests run: 2, Failures: 0, Errors: 0, Time elapsed: 38.955 sec
BUILD SUCCESSFUL
该示例插件还作为主 Hive 构建的一部分进行了构建和测试,以验证 PDK 是否按预期运行。
您自己的插件
要创建自己的插件,您可以按照示例插件中的模式进行操作。让我们仔细看看。首先,build.xml
:
<project name="pdktest" default="package">
<property name="plugin.libname" value="pdk-test-udf"/>
<property name="plugin.title" value="Hive PDK Test UDF Library"/>
<property name="plugin.version" value="0.1"/>
<property name="plugin.vendor" value="Apache Software Foundation"/>
<property name="function.sql.prefix" value="tp_"/>
<import file="${hive.install.dir}/scripts/pdk/build-plugin.xml"/>
</project>
这个构建文件所做的全部工作就是定义一些变量设置,然后从 PDK 导入一个构建脚本,其余的工作(包括定义用于构建和测试插件的包和测试目标)。因此,对于您自己的插件,请相应地更改变量设置,然后将 hive.install.dir 设置为您安装 Hive 发行版的位置。
导入的 PDK 构建文件假设有关插件源结构的一些信息:
your-plugin-root
build.xml
- src
Java 源文件
- test
setup.sql
cleanup.sql
测试所需的任何数据文件
对于示例插件,数据文件 onerow.txt 包含一行数据; setup.sql 创建一个名为 onerow 的表并加载数据文件,而 cleanup.sql 删除 onerow 表。 onerow 表可方便地测试 UDF。
Annotations
现在,让我们看一下 UDF 的源代码。
package org.apache.hive.pdktest;
import org.apache.hive.pdk.HivePdkUnitTest;
import org.apache.hive.pdk.HivePdkUnitTests;
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
/**
* Example UDF for rot13 transformation.
*/
@Description(name = "rot13",
value = "_FUNC_(str) - Returns str with all characters transposed via rot13",
extended = "Example:\n"
+ " > SELECT _FUNC_('Facebook') FROM src LIMIT 1;\n" + " 'Snprobbx'")
@HivePdkUnitTests(
setup = "create table rot13_data(s string); "
+ "insert overwrite table rot13_data select 'Facebook' from onerow;",
cleanup = "drop table if exists rot13_data;",
cases = {
@HivePdkUnitTest(
query = "SELECT tp_rot13('Mixed Up!') FROM onerow;",
result = "Zvkrq Hc!"),
@HivePdkUnitTest(
query = "SELECT tp_rot13(s) FROM rot13_data;",
result = "Snprobbx")
}
)
public class Rot13 extends UDF {
private Text t = new Text();
public Rot13() {
}
public Text evaluate(Text s) {
StringBuilder out = new StringBuilder(s.getLength());
char[] ca = s.toString().toCharArray();
for (char c : ca) {
if (c >= 'a' && c <= 'm') {
c += 13;
} else if (c >= 'n' && c <= 'z') {
c -= 13;
} else if (c >= 'A' && c <= 'M') {
c += 13;
} else if (c >= 'N' && c <= 'Z') {
c -= 13;
}
out.append(c);
}
t.set(out.toString());
return t;
}
}
PDK 将 Comments 解释如下:
@Description:向 Hive 提供有关 UDF 语法和用法的元数据。在生成的 class-registration.sql 中仅包含带有此注解的类
@HivePdkUnitTests:枚举一个或多个测试用例,并指定在测试用例之前和之后运行的可选设置和清除命令。
@HivePdkUnitTest:指定一个测试用例,包括要运行的查询和预期结果
注解允许代码和测试保持紧密联系。这对小型测试很有用。如果测试非常复杂,则可能需要围绕 Hive CLI 设置自己的脚本。
Test Execution
PDK 执行以下测试:
运行顶层 cleanup.sql(以防先前的测试在中间失败)
运行顶级 setup.sql
对于每个带有@HivePdkUnitTests 注解的类
运行类清理(如果有)
运行类设置(如果有)
对于每个@HivePdkUnitTest 注解,运行查询并验证实际结果是否与预期结果匹配
运行类清理(如果有)
运行顶级 cleanup.sql
如果在测试执行过程中遇到问题,请查看文件TEST-org.apache.hive.pdk.PluginTest.txt
以获取详细信息。
Futures
支持其他插件类型的 Comments
添加更多 Comments 以在运行时自动验证功能参数(而不是要求开发人员为此编写命令式 Java 代码)
添加 Eclipse 支持
移动 Hive 内置程序以使用 PDK 进行更方便的测试(HIVE-2523)
用于调用单个测试用例的命令行选项