Spark SQL和使用现有的配置单元udfs

时间:2019-07-14 07:00:58

标签: apache-spark hadoop hive apache-spark-sql hiveql

我必须阅读spark中现有的配置单元udf,因此在spark.sql中,我正在创建临时函数并使用它,它在spark shell中运行良好,但在spark-submit中,它失败并显示错误:

  

org.apache.hadoop.hive.metadata.HiveException:无法执行   方法public static boolean   对对象xxxx.udf com.xxx.x.x.udfs.isb_udf.evaluate(Java.lang.string)   xxxx类,其参数为1的args {Java.lang.string} ...

我也看到了... 由Java.lang.reflect.InvocationTargetException

引起

代码示例:

spark.sql("CREATE TEMPORARY FUNCTION currency AS 'com.spark.udf.FormatCurrency'"); 
val x = spark.sql("select currency(col1) from hive_table") ;

x.show()

以上命令在spark外壳中有效,但在spark提交中不起作用。

信息:如果我在没有udf的情况下读取hive表,则它在spark提交中起作用。使用蜂巢udf时可能会发生此问题。

1 个答案:

答案 0 :(得分:1)

原因之一是,如果您使用多个jar传递火花提交,并且它包含您的UDF使用的同一类,则可能会出现此问题。之前我有一个类似的案例,我删除了罐子,并在一个罐子中添加了一个罐子以及spark提交。这个对我有用。我不知道你的情况。尝试移除多个罐子,确保可以正常使用。