apache-spark - write - spark sql이란




Spark SQL의 기존 Hive 영구 UDF를 사용할 수 없음 (2)

Spark 2.0은 JAR이 HDFS에있는 기능을 실행할 수 없습니다.

Spark SQL : Thriftserver가 등록 된 하이브 UDTF를 실행할 수 없음

한 가지 해결 방법은 jar 경로가 로컬 에지 노드 경로를 가리키는 Spark 작업에서 함수를 임시 함수로 정의하는 것입니다. 그런 다음 동일한 스파크 작업에서 함수를 호출하십시오.

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

이전에 하이브가있는 UDF를 등록했습니다. TEMPORARY 가 아니라 영구적입니다. 그것은 beeline에서 작동합니다.

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"

UDF를 spark (metastore를 우회 함)에 등록하려고 시도하면 등록이 실패하여 이미 존재 함을 나타냅니다.

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는 스칼라이고 스파크 드라이버 코드는 파이썬입니다.

나는 혼란 스럽다.

  • 스파크가 메타 스토어 정의 영구 UDF를 사용할 수 있다고 가정 할 때 나는 맞습니까?
  • 하이브에 올바르게 함수를 작성하고 있습니까?

그러나 원사 환경에서는 spark-shell -jars .jar를 hdfs가 아닌 local을 사용해야한다고 제안한 바 있습니다.