无法使用spark sql中的现有配置单元永久udf

qij5mzcb  于 2021-06-28  发布在  Hive
关注(0)|答案(2)|浏览(559)

我以前在hive注册过自定义项。它是永久的,不是 TEMPORARY . 它是直线工作的。

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

我已将spark配置为使用hive元存储。配置正在运行,因为我可以查询配置单元表。我能看到自由民主党;

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可以使用metastore定义的永久udf,我的假设正确吗?
我是否在配置单元中正确创建了函数?

gxwragnw

gxwragnw1#

问题是spark 2.0无法执行JAR位于hdfs上的函数。
spark sql:thriftserver无法运行已注册的配置单元udtf
一种解决方法是将函数定义为spark job中的临时函数,jar路径指向本地边缘节点路径。然后在同一个spark作业中调用函数。

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

dz6r00yl2#

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

相关问题