2016-08-18 12 views
22

以前にハイブを持つUDFを登録しました。それは永久ではないTEMPORARYです。それはビーラインで動作します。Spark SQLの既存のHive永続UDFを使用できません

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

ハイブメタストアを使用するようにスパークが設定されています。私はハイブテーブルを照会できるので、configが動作しています。私は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';" 

私はスパーク2.0のハイブメタストア1.1.0を使用しています。 UDFはスカラー、私のスパークドライバーコードはPythonです。

私は困惑しています。

  • スパークは、メタストア定義の永続UDFを利用できると私は間違いありませんか?
  • ハイブで正しく機能を作成していますか?
+0

あなたの 'SparkSession.builder'で' enableHiveSupport() 'を定義しましたか? –

+0

そうです。私は見ることができ、ハイブ定義テーブルを照会するよう照会するので、ハイブサポートが適切に有効になっていると仮定します。 –

+0

Humm ... spark-submitまたはspark-shell呼び出しでUDF jarを定義しましたか? './bin/spark-shell --jars .jar' –

答えて

1

関数は、select(SQL Serverのように)でdirectlyを呼び出すことはできません。

oracleのようなDumyテーブルを作成する必要があります。

CREATE TABLEデュアル(ダミーSTRING);

ロードデータローカルのinpath '/path/to/textfile/dual.txt'はテーブルdualに上書きされます。

select normaliseURL( 'value')from dual;あなたが火花 - シェル--jarsを使用する必要が示唆されしかしとしてそれは糸環境に火花上で動作します

または

SELECT normaliseURLから*(「値」)

+0

FYI、少なくともnormalizeURL( 'value')を選択することができます。その構文には何も問題はありません。 – Azeroth2b

0

はHDFSではなくではない.jarファイル地元。

0

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

Spark SQL: Thriftserver unable to run a registered Hive UDTF

つの回避策ローカルエッジノード・パスを指すジャー経路とスパークジョブの一時的な関数としての機能を定義することです。次に、同じSparkジョブで関数を呼び出します。

CREATE TEMPORARY FUNCTION functionName as 'com.test.HiveUDF' USING JAR '/user/home/dir1/functions.jar' 
関連する問題