web-dev-qa-db-ja.com

Spark SQLの既存のHiveパーマネントUDFを使用できません

以前にHiveにUDFを登録しました。 TEMPORARYではなく永続的です。それはビーラインで動作します。

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

spark Hiveメタストアを使用するように構成されています。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=はメタストアで定義されたパーマネントUDFを利用できますか?
  • ハイブで関数を正しく作成していますか?
24
Rob Cowie

問題はSpark 2.0は、JARがHDFSにある関数を実行できません。

Spark SQL:Thriftserverは登録済みのHive UDTFを実行できません

回避策の1つは、Sparkローカルエッジノードパスを指すjarパスを持つジョブで一時関数として関数を定義することです。その後、同じSpark =仕事。

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

糸の環境ではsparkで動作しますが、spark-Shell --jars <path-to-your-Hive-udf>.jarはhdfsではなくローカルにあります。

0
Nitin