背景:
写了一个UDF A.class放在A.jar里。A.class依赖B.jar中的B.class。B.class又依赖C.jar中的C.class。
使用add jar把A.jar、B.jar、C.jar把jar包加入classpath
hive脚本里执行create temporary function XXX as "A.class"时抛出异常“C.class not found”
解决方法:
设置环境变量:
export HIVE_AUX_JARS_PATH=`pwd` #jar包和脚本放在同级目录下
原理:
hive cli的启动脚本“hive”中有如下几行:
if [ -d "${HIVE_AUX_JARS_PATH}" ]; then
for f in ${HIVE_AUX_JARS_PATH}/*.jar; do
if [[ ! -f $f ]]; then
continue;
fi
if $cygwin; then
f=`cygpath -w "$f"`
fi
AUX_CLASSPATH=${AUX_CLASSPATH}:$f
if [ "${AUX_PARAM}" == "" ]; then
AUX_PARAM=file://$f
else
AUX_PARAM=${AUX_PARAM},file://$f;
fi
done
elif [ "${HIVE_AUX_JARS_PATH}" != "" ]; then
HIVE_AUX_JARS_PATH=`echo $HIVE_AUX_JARS_PATH | sed 's/,/:/g'`
if $cygwin; then
HIVE_AUX_JARS_PATH=`cygpath -p -w "$HIVE_AUX_JARS_PATH"`
HIVE_AUX_JARS_PATH=`echo $HIVE_AUX_JARS_PATH | sed 's/;/,/g'`
fi
AUX_CLASSPATH=${AUX_CLASSPATH}:${HIVE_AUX_JARS_PATH}
AUX_PARAM="file://$(echo ${HIVE_AUX_JARS_PATH} | sed 's/:/,file:\/\//g')"
fi
具体jar包是如何加入hive的classpath还需要继续研究。