我以前注册过一个带有蜂巢的UDF。它是永久性的,而不是TEMPORARY。它在直线上工作。
CREATE FUNCTION normaliseURL AS 'com.example.hive.udfs.NormaliseURL' USING JAR 'hdfs://udfs/hive-udfs.jar';我已经配置了电火花来使用蜂巢亚稳态。配置正在工作,因为我可以查询单元表。我可以看到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';"我用的是Spark2.0,蜂巢亚稳态1.1.0。UDF是scala,我的火花驱动程序代码是python。
我很困惑。
发布于 2017-08-28 18:13:30
问题是Spark2.0无法执行其JAR位于HDFS上的函数。
Spark : Thriftserver无法运行已注册的Hive UDTF
解决方法之一是将函数定义为星火作业中的临时函数,jar路径指向本地边缘节点路径。然后调用同一个火花作业中的函数。
CREATE TEMPORARY FUNCTION functionName as 'com.test.HiveUDF' USING JAR '/user/home/dir1/functions.jar'发布于 2016-12-20 22:38:58
它将工作在火花上的纱线环境,然而,如建议,您需要使用spark-shell --jars <path-to-your-hive-udf>.jar,不是在hdfs,而是在本地。
https://stackoverflow.com/questions/39023638
复制相似问题