【问题标题】:Unable to use an existing Hive permanent UDF from Spark SQL无法使用来自 Spark SQL 的现有 Hive 永久 UDF
【发布时间】:2016-12-25 16:56:02
【问题描述】:

我之前已经用 hive 注册了一个 UDF。它是永久的,不是TEMPORARY。它适用于直线。

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

我已将 spark 配置为使用 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(绕过元存储),它无法注册它,这表明它已经存在。

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?
  • 我是否在 hive 中正确创建了函数?

【问题讨论】:

  • 在您的SparkSession.builder 中定义了enableHiveSupport() 吗?
  • 是的,我做到了。我可以看到,并从 spark 查询配置单元定义的表,因此我假设配置单元支持已适当启用。
  • 嗯...您是否在 spark-submit 或 spark-shell 调用中定义了 UDF jar?喜欢:./bin/spark-shell --jars <path-to-your-hive-udf>.jar
  • @RobCowie: 你确定 value 列的 DataType 在 UDF 类(在 Scala 中)和它返回的查询中是相同的吗?
  • 您好,我想您用于 udf 的 jar 无法触发并且您收到该错误,请尝试检查此答案,因为在我看来这是您的问题:stackoverflow.com/questions/43272446/…

标签: apache-spark hive apache-spark-sql udf


【解决方案1】:

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

Spark SQL: Thriftserver unable to run a registered Hive UDTF

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

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

【讨论】:

    【解决方案2】:

    它适用于纱线环境中的 spark,但建议您需要在本地而不是在 hdfs 中使用 spark-shell --jars <path-to-your-hive-udf>.jar

    【讨论】:

      猜你喜欢
      • 2017-03-15
      • 2017-09-02
      • 2019-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-01
      • 2021-02-23
      • 1970-01-01
      相关资源
      最近更新 更多