【问题标题】:Defined Spark Permanent UDF which can see in metastore but can not use in hive SQL on Spark定义的 Spark 永久 UDF,可以在 Metastore 中看到,但不能在 Spark 上的 hive SQL 中使用
【发布时间】:2017-09-02 12:04:42
【问题描述】:
CREATE FUNCTION hello AS 'com.dtstack.main.udf.HelloUDF' USING JAR 'hdfs:///172.16.1.151:9000/user/spark/sparkUDF.jar'

使用过

select hello(xcval) from xctable

错误:org.apache.spark.sql.AnalysisException:未定义函数: '你好'。此函数既不是注册的临时函数,也不是 在数据库“默认”中注册的永久功能。第 1 行位置 7

谁能帮帮我?

【问题讨论】:

    标签: apache-spark hive


    【解决方案1】:

    要在 hive 中创建永久功能,您需要将 jar 放在 hive.auxiliary.path 上。

    hive.auxiliary.path 是 hive 读取 udf 的默认位置,如果你的 jar 文件在该位置不可用,你将无法访问它。

    因为当您创建函数时,hive 知道您的 jar 的位置为“hdfs:///172.16.1.151:9000/user/spark/sparkUDF.jar”,但要使其可用于 spark,您必须部署它在辅助路径上,因为一旦你的配置单元会话关闭,配置单元只存储你的函数的定义,而不是位置和位置,它将转到辅助路径。

    有关 udf 部署的更多信息,请查看https://www.cloudera.com/documentation/enterprise/5-4-x/topics/cm_mc_hive_udf.html

    【讨论】:

    • 当我只使用 hive 时,它​​可以工作,但是当我将它与 spark 一起使用时,它就会出现上述问题。
    • 因为当您创建一个函数时,hive 知道您的 jar 的位置为“hdfs:///172.16.1.151:9000/user/spark/sparkUDF.jar”,但要使其可用于 spark您必须将其部署在辅助路径上,因为一旦您的 hive 会话关闭,hive 仅存储您的函数的定义,但不存储位置,对于位置,它将转到辅助路径。
    • 我发现另一个问题。我怎样才能注册一个永久的 hive udf 进行编码。它不能更改用于设置辅助路径的配置。你有解决方案吗。
    • 我已经解决了。这是火花的错误。添加代码支持 hdfs 文件。这是临时解决方案。编辑 SparkContext.scala。在其中添加跟随行。 URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
    猜你喜欢
    • 2016-12-25
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 2016-11-01
    • 2022-06-14
    • 1970-01-01
    相关资源
    最近更新 更多