自定義UDF時引用JAR包的另外一種方式

背景:shell

  1. 寫了一個UDF A.class放在A.jar裏。A.class依賴B.jar中的B.class。B.class又依賴C.jar中的C.class。spa

  2. 使用add jar把A.jar、B.jar、C.jar把jar包加入classpathcode

  3.  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

相關文章
相關標籤/搜索