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