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

2024-02-12

我之前已经向 hive 注册了一个 UDF。是永久的不是TEMPORARY。它直线工作。

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

我已将 Spark 配置为使用配置单元元存储。该配置正在运行,因为我可以查询配置单元表。我可以看到 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(绕过元存储),则无法注册它,这表明它已经存在。

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 元存储 1.1.0。 UDF是scala,我的spark驱动程序代码是python。

我很困惑。

  • 我关于 Spark 可以利用元存储定义的永久 UDF 的假设是否正确?
  • 我是否在配置单元中正确创建了该函数?

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

Spark SQL:Thriftserver 无法运行已注册的 Hive UDTF https://issues.apache.org/jira/browse/SPARK-18832

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

CREATE TEMPORARY FUNCTION functionName as 'com.test.HiveUDF' USING JAR '/user/home/dir1/functions.jar'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法从 Spark SQL 使用现有的 Hive 永久 UDF 的相关文章

随机推荐