【发布时间】: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