背景:shell
寫了一個UDF A.class放在A.jar裏。A.class依賴B.jar中的B.class。B.class又依賴C.jar中的C.class。spa
使用add jar把A.jar、B.jar、C.jar把jar包加入classpathcode
hive腳本里執行create temporary function XXX as "A.class"時拋出異常「C.class not found」io
解決方法:function
設置環境變量:
class
export HIVE_AUX_JARS_PATH=`pwd` #jar包和腳本放在同級目錄下
變量
原理:原理
hive cli的啓動腳本「hive」中有以下幾行:
cli
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還須要繼續研究。sed