hive 在用命令行工具启动时会运行./ext/cli.sh
THISSERVICE=cli
export SERVICE_LIST="${SERVICE_LIST}${THISSERVICE} "
cli () {
CLASS=org.apache.hadoop.hive.cli.CliDriver
execHiveCmd $CLASS "$@"
}
cli_help () {
CLASS=org.apache.hadoop.hive.cli.CliDriver
execHiveCmd $CLASS "--help"
}
从而进入
org.apache.hadoop.hive.cli.CliDriver的main方法中执行。
进入Driver的runInterval方法后
driverRunHooks = getHooks(HiveConf.ConfVars.HIVE_DRIVER_RUN_HOOKS,
HiveDriverRunHook.class);
for (HiveDriverRunHook driverRunHook : driverRunHooks) {
driverRunHook.preDriverRun(hookContext);
}
其中:
HIVE_DRIVER_RUN_HOOKS("hive.exec.driver.run.hooks","")
是可以在hive-site.xml中写入的配置,value是具体的类,我们的自定义udf就可以通过这个预处理操作加载进来。
具体方法如下:
1. 定义一个UdfHooks类(自定义类名)实现HiveDriverRunHook接口,在实现其preDriverRun方法里面使用:FunctionRegistry.registerTemporaryUDF来注册自定义的udf(自定义udf只需要定义类extends UDF,实现其中方法即可)。
2. 将程序打成jar包,拷贝到$HIVE_HOME/auxlib目录下(在hive可执行脚本里会自动加载该目录下的jar包到环境变量中)
3. 在$HIVE_HOME/conf/hive-site.xml里面增加配置
<property>
<name>hive.exec.driver.run.hooks</name>
<value>***.UDFHooks</value>
</property>