HIVE UDF (User Defined Function)란?
Hive UDF(User Defined Function)는 사용자가 직접 정의하여 Hive에서 사용할 수 있는 함수. 기본적으로 Hive는 다양한 내장 함수(Built-in Functions)를 제공하지만, 특정한 데이터 변환이나 복잡한 로직이 필요할 때는 UDF를 직접 구현하여 사용할 수 있다.
Hive UDF는 Java로 작성하며, 개발한 후 Hive에 등록하여 SQL 쿼리에서 사용할 수 있다.
1. Hive UDF의 종류
Hive에서 제공하는 사용자 정의 함수 3가지 유형.
✅ 1) UDF (User Defined Function)
- 단일 행 입력을 받아 하나의 값을 반환하는 함수
- 예: 문자열 변환, 특정 조건 처리 등
✅ 2) UDAF (User Defined Aggregate Function)
- 여러 개의 행을 입력받아 집계(Aggregation) 결과를 반환하는 함수
- 예: 평균 계산, 사용자 정의 SUM, COUNT 등
✅ 3) UDTF (User Defined Table-Generating Function)
- 하나의 행을 입력받아 여러 개의 행을 반환하는 함수
- 예: JSON 파싱, 문자열 토큰화 등
2. UDF 작성 및 사용 예제 (Java)
✅ 기본 UDF 작성 (대문자로 변환하는 함수)
ex) 입력 받은 문자열을 대문자로 변환하는 Hive UDF(UPPER)
java
import org.apache.hadoop.hive.ql.exec.UDF; import org.apache.hadoop.io.Text; public class UpperCaseUDF extends UDF { public Text evaluate(Text input) { if (input == null) { return null; } return new Text(input.toString().toUpperCase()); } }
✅ JAR 파일로 컴파일 후 Hive에 등록
- Java 파일을 컴파일하여 JAR 파일 생성
-
bashjavac -cp $(hadoop classpath):$(hive --config /etc/hive/conf classpath) UpperCaseUDF.java jar -cf uppercase-udf.jar UpperCaseUDF.class
- JAR 파일을 Hive에 추가
-
sqlADD JAR /path/to/uppercase-udf.jar;
- 함수를 등록
-
sqlCREATE TEMPORARY FUNCTION to_upper AS 'UpperCaseUDF';
- Hive 쿼리에서 사용
-
sql
SELECT to_upper(name) FROM employees;
3. UDAF (집계 함수) 예제
ex) Hive의 기본 AVG() 함수를 직접 구현.
java
import org.apache.hadoop.hive.ql.exec.UDAF; import org.apache.hadoop.hive.ql.exec.UDAFEvaluator; public class AvgUDAF extends UDAF { public static class AvgEvaluator implements UDAFEvaluator { private long sum; private long count; public AvgEvaluator() { init(); } public void init() { sum = 0; count = 0; } public boolean iterate(Long value) { if (value != null) { sum += value; count++; } return true; } public AvgEvaluator terminatePartial() { return this; } public boolean merge(AvgEvaluator other) { if (other != null) { sum += other.sum; count += other.count; } return true; } public Double terminate() { return count == 0 ? null : (double) sum / count; } } }
이후 JAR 파일을 생성하여 Hive에 등록.
4. UDTF (테이블 반환 함수) 예제
ex) split을 이용하여 문자열을 여러 행으로 변환하는 Hive UDTF.
java
import org.apache.hadoop.hive.ql.exec.UDTF; import org.apache.hadoop.io.Text; public class SplitUDTF extends UDTF { public void process(String str) { if (str == null) return; String[] tokens = str.split(" "); for (String token : tokens) { forward(new Object[]{new Text(token)}); } } public void close() {} }
Hive에서 사용법:
sql
SELECT split_words(sentence) FROM sentences;
문장을 단어별로 분할하여 여러 개의 행으로 출력.
5. 정리
UDF 유형기능예제
UDF | 하나의 값을 변환 | SELECT to_upper(name) FROM table; |
UDAF | 여러 행을 하나의 값으로 집계 | SELECT my_avg(salary) FROM employees; |
UDTF | 한 행을 여러 행으로 변환 | SELECT split_words(sentence) FROM sentences; |
💡 UDF를 사용하면?
- 기본 제공되는 Hive 내장 함수로 해결할 수 없는 복잡한 로직을 직접 구현 가능
- Java로 작성하여 Hive에서 확장 가능한 기능 추가 가능
- 성능 최적화 및 특정 도메인 요구 사항에 맞는 기능 개발 가능
'DB' 카테고리의 다른 글
DB - Hive (msck repair table) (0) | 2025.02.16 |
---|---|
DB - partition 접근 (0) | 2025.02.16 |
Hive - HQL 함수 (0) | 2025.02.02 |
SQL - begin, index, anti-join (0) | 2025.01.19 |
SQL - group by, alias 등 (1) | 2025.01.19 |