티스토리 뷰
hive 에서는 기본적으로 제공되는 함수들이 많이 존재한다. 이것보다 더 다양한 기능을 만들고 싶다면 관련된 추상클래스를 확장해서 개발하고 빌드해서 add jar 를 해서 함수를 써야하는 번거로움이 존재한다.
근데, 단순히 기본으로 제공하는 함수의 조합을 함수와 유사하게 사용하는 방법이 존재한다. 그게 바로 macro 이다.
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF
사용방법
영구적으로 등록하지 못하고, 해당 세션에만 유지가능한게 단점인데, beeline 에서 -i 옵션으로 미리 쿼리를 돌릴 대상으로 관리해서 쓰면 약간의 번거로움은 그래도 해결이 되고, 빌드없이 비즈니스 로직을 UDF 랑 유사하게 관리할 수 있다는것이 가장 큰 장점이 아닌가 싶다.
기본적인 표현방법은 아래와 같다.
CREATE TEMPORARY MACRO macro_name([col_name col_type, ...]) expression;
미리 macro 를 별도의 hql 파일로 저장하고, beeline 실행할때 -i 옵션으로 기동시 먼저 로딩하게 하면 유용할것이다.
사용예시
code 값을 한글이름으로 변환하는 로직이 있다면, MACRO 로 만들어서 활용하는것이 가능하다.
좀더 유용하게 쓰이는건 json 이나 struct 값에서 일부 값을 추출해서 사용하는 반복적인 경우가 많은데 이때 사용하면 유용하다.
특히, 쿼리를 관리하는 입장에서도 유리한게 비즈니스적인 요소는 변경이 될 수 있는데, 이게 파편화 되면 관리가 어려운 문제가 있는데 이것이 상대적으로 편해진다.
예를 들어, code 를 이름으로 변경하는 쿼리를 모든 쿼리에 case when 으로 추가했으면, 코드하나 더 추가하려면 모든 쿼리를 뒤져서 수정해야하는데, 매크로로 분리해서 관리하면 매크로 파일만 수정하면 되기 때문에 유지보수할때 매우 유용하다.
beeline> CREATE TEMPORARY MACRO category_code_to_name(code STRING)
CASE
WHEN code = 'ADDRESS' THEN '주소'
WHEN code = 'TEL' THEN '전화번호'
ELSE '분류없음' END;
beeline> SELECT t.* , category_code_to_name(code) as name FROM (
SELECT 'ADDRESS' as code, 1 as seq
UNION ALL
SELECT 'IMAGE' as code, 2 as seq
UNION ALL
SELECT 'TEL' as code, 3 as seq
) t;
-- 결과
+----------+--------+-------+
| t.code | t.seq | name |
+----------+--------+-------+
| ADDRESS | 1 | 주소 |
| IMAGE | 2 | 분류없음 |
| TEL | 3 | 전화번호 |
+----------+--------+-------+
3 rows selected (0.15 seconds)
실제로 조건에 따른 메트릭값이 유도되는 복잡한 로직이 있었고, N개의 차원으로 집계를 해야했는데 스펙이 변경되서 고칠때 관련된 로직만 매크로로 분리해서 재활용해서 수정하기위한 작업이 훨~~씬 간결해진 경험이 존재한다.
'데이터처리 > Hive' 카테고리의 다른 글
[Hive 4.x] 새버전에 추가된 유용한 UDF 소개 2탄 - json_read (0) | 2024.06.28 |
---|---|
[Hive 4.x] 새버전에 추가된 유용한 UDF 소개 1탄 - approx_distinct (0) | 2024.06.24 |
[HIVE] Struct 타입의 일부값만 변경하는 UDF : set_value (2) | 2024.02.07 |
[HIVE] hive 4.x 에 있는 array udf 추출버전 jar - hive 3.x 버전에서 활용하기 (0) | 2024.01.29 |
[HIVE] hive 4.x 버전에 추가된 array 함수 8개 : 예제 포함 (0) | 2024.01.26 |