다음을 통해 공유


Hive UDF, UDAF 및 UDTF와의 통합

적용 대상: 예로 표시된 확인 Databricks 런타임

Spark SQL은 Hive UDF, UDAF 및 UDTF의 통합을 지원합니다. Spark UDF 및 UDAF와 마찬가지로 Hive UDF는 단일 행에서 입력으로 작동하고 단일 행을 출력으로 생성하는 반면 Hive UDAF는 여러 행에서 작동하고 결과적으로 집계된 단일 행을 반환합니다. 또한 Hive는 한 행에서 입력으로 작동하고 여러 행을 출력으로 반환하는 UDTF(사용자 정의 테이블 형식 함수)도 지원합니다. Hive UDF/UDAF/UTF를 사용하려면 사용자가 Spark에 등록한 다음, Spark SQL 쿼리에서 사용해야 합니다.

예제

Hive에는 UDFGenericUDF라는 두 개의 UDF 인터페이스가 있습니다. 아래 예제에서는 GenericUDF에서 파생된 GenericUDFAbs를 사용합니다.

-- Register `GenericUDFAbs` and use it in Spark SQL.
-- Note that, if you use your own programmed one, you need to add a JAR containing it
-- into a classpath,
-- e.g., ADD JAR yourHiveUDF.jar;
CREATE TEMPORARY FUNCTION testUDF AS 'org.apache.hadoop.hive.ql.udf.generic.GenericUDFAbs';

SELECT * FROM t;
+-----+
|value|
+-----+
| -1.0|
|  2.0|
| -3.0|
+-----+

SELECT testUDF(value) FROM t;
+--------------+
|testUDF(value)|
+--------------+
|           1.0|
|           2.0|
|           3.0|
+--------------+

아래 예제에서는 GenericUDTF에서 파생된 GenericUDTFExplode를 사용합니다.

-- Register `GenericUDTFExplode` and use it in Spark SQL
CREATE TEMPORARY FUNCTION hiveUDTF
    AS 'org.apache.hadoop.hive.ql.udf.generic.GenericUDTFExplode';

SELECT * FROM t;
+------+
| value|
+------+
|[1, 2]|
|[3, 4]|
+------+

SELECT hiveUDTF(value) FROM t;
+---+
|col|
+---+
|  1|
|  2|
|  3|
|  4|
+---+

Hive에는 UDAFGenericUDAFResolver라는 두 개의 UDAF 인터페이스가 있습니다. 아래 예제에서는 GenericUDAFResolver에서 파생된 GenericUDAFSum을 사용합니다.

-- Register `GenericUDAFSum` and use it in Spark SQL
CREATE TEMPORARY FUNCTION hiveUDAF
    AS 'org.apache.hadoop.hive.ql.udf.generic.GenericUDAFSum';

SELECT * FROM t;
+---+-----+
|key|value|
+---+-----+
|  a|    1|
|  a|    2|
|  b|    3|
+---+-----+

SELECT key, hiveUDAF(value) FROM t GROUP BY key;
+---+---------------+
|key|hiveUDAF(value)|
+---+---------------+
|  b|              3|
|  a|              3|
+---+---------------+