异常如下:
No handler for UDF/UDAF/UDTF 'com.******.***': java.lang.ClassNotFoundException: com.***; line 1 pos 7
org.apache.spark.sql.AnalysisException: No handler for UDF/UDAF/UDTF 'com.***': java.lang.ClassNotFoundException: com.***; line 1 pos 7
这个异常其实是Spark sql在对hive 自定义udf 二次调用导致的异常的BUG,现在还没修复,受影响的Spark版本包括spark2.3/2.4
详情见这个issue 自定义udf 二次调用导致的异常
我尝试发现是在启动spark 带上 --jars指定udf jar包就不会出现该问题。不带jar包 第一次调用executor会从远程下载这个jar 正常执行没出问题,第二次classloader加载时会出问题,具体原因不明,后面再研究。
再总结下Spark UDF与Hive UDF那些小坑:
1.首先 Spak UDF不支持重载,Hive UDF 可以重载。Spark SQL某些内部函数是有重载功能的,比如to_timestamp() 这些是通过FunctionRegistry这个类注册的

文章详细介绍了在Spark中遇到的针对Hive UDF二次调用时出现的异常问题,该异常源于Spark的一个未修复BUG。作者提供了解决方案,即在启动Spark时通过`--jars`指定UDF JAR包,避免Executor在第二次加载时出现问题。此外,文章还总结了Spark UDF与Hive UDF的区别和集成时可能遇到的坑,包括重载问题、创建冲突和执行选择等。
最低0.47元/天 解锁文章
883





