DB

Hive - UDF

개발 일기92 2025. 2. 2. 17:08

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에 등록

  1. Java 파일을 컴파일하여 JAR 파일 생성
  2. bash
    javac -cp $(hadoop classpath):$(hive --config /etc/hive/conf classpath) UpperCaseUDF.java jar -cf uppercase-udf.jar UpperCaseUDF.class
  3. JAR 파일을 Hive에 추가
  4. sql
    ADD JAR /path/to/uppercase-udf.jar;
  5. 함수를 등록
  6. sql
    CREATE TEMPORARY FUNCTION to_upper AS 'UpperCaseUDF';
  7. Hive 쿼리에서 사용
  8. 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