异常如下:
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()