Hive UDF/UDAF/UDTF 통합
Hive UDF/UDAF/UDTF 통합 (Integration with Hive UDFs/UDAFs/UDTFs)
Spark SQL은 Hive의 UDF, UDAF, UDTF를 통합해 사용할 수 있게 해줘요. Hive UDF는 Spark UDF와 비슷하게 한 행을 입력받아 한 행을 출력하고, Hive UDAF는 여러 행을 입력받아 하나의 집계된 행을 반환해요. Hive는 또한 한 행을 입력받아 여러 행을 출력하는 UDTF(사용자 정의 테이블 함수)도 지원해요. 예제와 함께 사용 방법을 설명할게요.
출처: 문서
본문
설명 (Description)
Spark SQL은 Hive UDF, UDAF, UDTF의 통합을 지원해요. Spark UDF·UDAF와 유사하게, Hive UDF는 단일 행을 입력으로 받아 단일 행을 출력으로 생성하고, Hive UDAF는 여러 행에 대해 동작해 하나의 집계된 행을 결과로 반환해요. 또한 Hive는 한 행을 입력으로 받아 여러 행을 출력으로 반환하는 UDTF(사용자 정의 테이블 함수)도 지원해요. Hive UDF/UDAF/UDTF를 사용하려면, 사용자가 그것들을 Spark에 등록(register)한 다음 Spark SQL 쿼리에서 사용해야 해요.
예제 (Examples)
Hive에는 두 가지 UDF 인터페이스가 있어요: UDF와 GenericUDF. 다음 예제는 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|
+--------------+
-- Register `UDFSubstr` and use it in Spark SQL.
-- Note that, it can achieve better performance if the return types and method parameters use Java primitives.
-- e.g., UDFSubstr. The data processing method is UTF8String <-> Text <-> String. we can avoid UTF8String <-> Text.
CREATE TEMPORARY FUNCTION hive_substr AS 'org.apache.hadoop.hive.ql.udf.UDFSubstr';
select hive_substr('Spark SQL', 1, 5) as value;
+-----+
|value|
+-----+
|Spark|
+-----+
다음 예제는 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에는 두 가지 UDAF 인터페이스가 있어요: UDAF와 GenericUDAFResolver. 다음 예제는 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|
+---+---------------+
더 알아보기 (Learn more)
- 아파치 스파크 SQL 참조 (원문)
- Scalar User-Defined Functions (UDFs) — 스칼라 UDF
- User-Defined Aggregate Functions (UDAFs) — UDAF
- Functions — 함수 전반 문서