Hive 사용자 정의 함수


하이브가 제공하는 내장 함수로 원하는 쿼리를 쉽게 또는 전혀 작성할 수 없는 경우가 있다. 하이브는 사용자 정의 함수(UDF)를 통해 사용자 자신의 데이터 처리 코드를 플러그인하고 하이브 쿼리에서 그 함수를 호출할 수 있는 방식을 제공한다.

UDF는 하이브가 개발된 언어인 자바로 작성해야 한다. 다른 언어를 사용하려면 사용자 정의 스크립트로 데이터를 내보내는(하둡 스트리밍 방식) SELECT TRANSFORM 절을 사용해야 한다.

하이브는 정규 UDF, 사용자 정의 집계 함수(User-Defined Aggregate Function, UDAF), 사용자 정의 테이블 생성 함수(User-Defined Table-generating Function, UDTF) 등 세 종류의 UDF를 지원한다. 세 종류의 차이점은 입력으로 받는 행과 출력되는 행의 개수가 다르다는 것이다.


  • 정규 UDF는 단일 행을 처리한 후 단일 행을 출력한다. 수학 함수나 문자열 함수와 같은 대부분의 함수가 여기에 해당한다.
  • UDAF는 다수의 입력 행을 처리한 후 단일 행을 출력한다. COUNT나 MAX 같은 집계 함수가 여기에 해당한다.
  • UDTF는 단일 로우를 처리한 후 다수의 행(테이블)을 출력한다.

테이블 생성 함수는 다른 두 종류의 함수에 비해 잘 알려지지 않았다.

CREATE TABLE arrays (x ARRAY<STRING>)
ROW FORMAT DELIMITED
  FIELDS TERMINATED BY '\001'
  COLLECTION ITEMS TERMINATED BY '\002';


ROW FORMAT 절에서 배열의 원소를 Ctrl-B 문자로 구분한다고 명시하였다.

a^Bb
c^Bd^Be

LOAD DATA 명령을 실행한 후 다음 쿼리를 통해 데이터가 제대로 로드되었는지 확이한다.


SELECT * FROM arrays;
["a","b"]
["c","d","e"]


그 다음에 이 테이블을 변형하기 위해 explode UDTF를 사용할 수 있다. 이 함수는 배열의 각 원소를 단일 행으로 내보내는데, 여기서 출력 컬럼 y의 자료형은 STRING이다. 이 테이블을 처리한 결과는 총 5개의 행에 고르게 펴진다.


SELECT explode(x) AS y FROM arrays;
a
b
c
d
e