无法从Spark SQL中使用现有的Hive永久UDF



我以前已经在hive中注册了一个UDF。它是永久的,不是TEMPORARY。它可以直线运行。

CREATE FUNCTION normaliseURL AS 'com.example.hive.udfs.NormaliseURL' USING JAR 'hdfs://udfs/hive-udfs.jar';

我已经配置spark使用hive metastore。配置正在工作,因为我可以查询hive表。我可以看到UDF;

In [9]: spark.sql('describe function normaliseURL').show(truncate=False)
+-------------------------------------------+
|function_desc                              |
+-------------------------------------------+
|Function: default.normaliseURL             |
|Class: com.example.hive.udfs.NormaliseURL  |
|Usage: N/A.                                |
+-------------------------------------------+

但是我不能在sql语句中使用UDF;

spark.sql('SELECT normaliseURL("value")')
AnalysisException: "Undefined function: 'default.normaliseURL'. This function is neither a registered temporary function nor a permanent function registered in the database 'default'.; line 1 pos 7"

如果我尝试用spark注册UDF(绕过metastore),它会注册失败,这表明它已经存在。

In [12]: spark.sql("create function normaliseURL as 'com.example.hive.udfs.NormaliseURL'")
AnalysisException: "Function 'default.normaliseURL' already exists in database 'default';"

我使用Spark 2.0, hive metastore 1.1.0。UDF是scala,我的spark驱动代码是python。

我难住了。

  • 我的假设是正确的,Spark可以利用亚稳态定义的永久udf ?
  • 我是否在hive中正确创建了函数?

问题是Spark 2.0无法执行jar位于HDFS上的函数

Spark SQL: Thriftserver无法运行已注册的Hive UDTF

一种解决方法是将该函数定义为Spark作业中的临时函数,jar path指向本地边缘节点路径。然后在同一个Spark作业中调用该函数。

CREATE TEMPORARY FUNCTION functionName as 'com.test.HiveUDF' USING JAR '/user/home/dir1/functions.jar'

它将在spark yarn环境下工作,但是正如建议的那样,您需要在hdfs中使用spark-shell --jars <path-to-your-hive-udf>.jar,而不是在本地。

相关内容

  • 没有找到相关文章

最新更新