Hive UDF(User Defined Function)는 사용자가 직접 정의하여 Hive에서 사용할 수 있는 함수. 기본적으로 Hive는 다양한 내장 함수(Built-in Functions)를 제공하지만, 특정한 데이터 변환이나 복잡한 로직이 필요할 때는 UDF를 직접 구현하여 사용할 수 있다.
Hive UDF는 Java로 작성하며, 개발한 후 Hive에 등록하여 SQL 쿼리에서 사용할 수 있다.
Hive에서 제공하는 사용자 정의 함수 3가지 유형.
ex) 입력 받은 문자열을 대문자로 변환하는 Hive UDF(UPPER)
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()); } }
SELECT to_upper(name) FROM employees;
ex) Hive의 기본 AVG() 함수를 직접 구현.
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에 등록.
ex) split을 이용하여 문자열을 여러 행으로 변환하는 Hive UDTF.
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에서 사용법:
SELECT split_words(sentence) FROM sentences;
문장을 단어별로 분할하여 여러 개의 행으로 출력.
UDF 유형기능예제
| UDF | 하나의 값을 변환 | SELECT to_upper(name) FROM table; |
| UDAF | 여러 행을 하나의 값으로 집계 | SELECT my_avg(salary) FROM employees; |
| UDTF | 한 행을 여러 행으로 변환 | SELECT split_words(sentence) FROM sentences; |
| 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 (1) | 2025.01.19 |
| SQL - group by, alias 등 (2) | 2025.01.19 |