自定义UDF时引用JAR包的另一种方式

背景:

  1. 写了一个UDF A.class放在A.jar里。A.class依赖B.jar中的B.class。B.class又依赖C.jar中的C.class。

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

  3.  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还需要继续研究。

    

你可能感兴趣的:(自定义UDF时引用JAR包的另一种方式)