在Spark中使用Hive Registered UDF

时间:2016-06-29 14:55:54

标签: hive apache-spark-sql

我使用以下内容通过beeline在Hive中注册一个udf:

CREATE FUNCTION udfTest AS 'my.udf.SimpleUDF' USING JAR 'hdfs://hostname/pathToMyJar.jar'

然后我可以直线使用它如下:

SELECT udfTest(name) from myTable;

返回预期结果。

然后我启动了一个spark-shell并运行以下

sqlContext.sql("SELECT udfTest(name) from myTable")

哪个失败了。堆栈有几百行(这里我不能粘贴),但关键部分是:

  • org.apache.spark.repl.SparkIMain $ TranslatingClassLoader无法强制转换为java.net.URLClassLoader
  • 无法为default.udftest加载资源:java.lang.IllegalArgumentException:无法注册[/tmp/blarg/pathToMyJar.jar]

如果有什么突出的话,我可以提供更多细节。

是否可以在Spark中使用通过Hive注册的UDF?

Spark版本1.3.0

2 个答案:

答案 0 :(得分:0)

使用自定义UDF时,请确保应用程序中包含UDF的jar文件, OR 使用--jars命令行选项将UDF文件指定为参数同时启动spark-shell,如下所示

./bin/spark-shell --jars <path-to-your-hive-udf>.jar

有关详细信息,请参阅Calling Hive User-Defined Functions from Spark

答案 1 :(得分:0)

我们最近遇到了同样的问题。我们注意到的是,如果jar路径在本地可用,那么一切都很顺利。如果jar路径在hdfs上,它就不起作用。所以我们最终做的是使用FileSystem.copytoLocalFile在本地复制jar,然后添加复制的文件。在群集和客户端模式下为我们工作

PS。这是Spark 2.0我在谈论