Hive UDF


UDF를 작성하고 사용하는 과정을 살펴보기 위해 문자열의 끝에 있는 공백 문자를 잘라내는 간단한 UDF 예제

package com.hadoopbook.hive;

import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;

public class Strip extends UDF {
  private Text result = new Text();

  public Text evaluate(Text str){
    if (str == null) {
      return null;
    }
    result.set(StringUtils.strip(str.toString()));
    return result;
  }

  public Text evaluate(Text str, String stripChars){
    if (str == null) {
      return null;
    }
    result.set(StringUtils.strip(str.toString(), stripChars));
    return result;
  }
}

UDF는 다음 두 속성을 충족시켜야 한다.

  • UDF는 org.apache.hadoop.hive.ql.exec.UDF의 서브 클래스여야 한다.
  • UDF는 최소 하나의 evaluate() 메서드를 구현해야 한다.

evaluate() 메서드는 입력 인자의 개수, 자료형, 반환 자료형을 자유롭게 정할 수 있기 때문에 인터페이스로 정의되지 않는다. 하이브는 호출되는 하이브 함수와 일치하는 evaluate() 메서드를 찾기 위해 UDF를 조사한다.

Strip 클래스는 두 개의 evaluate() 메서드를 가진다. 첫 번째 메서드는 입력에서 선행과 후행 공백 문자를 잘라낸다. 두 번째 메서드는 문자열의 끝에 있는 주어진 문자 집합을 잘라낸다. 실제 문자열 처리는 아파치 공통 프로젝트의 StringUtils 클래스에 위임했기 때문에 단지 하둡 Writable 라이브러리의 text 사용법만 신경 쓰면 된다. 하이브는 실제로 UDF에 자바 기본형과 java.util.List 및 java.util.Map과 같은 자료형을 지원한다.


public String evaluate(String str)

Text 자료형을 사용하면 객체를 재사용하여 효율성을 높일 수 있다.

하이브에서 UDF를 사용하려면 먼저 컴파일된 자바 클래스를 JAR 파일에 반드시 포함시켜야 한다. 이 책의 예제 코드에 있는 mvn package 명령을 사용하면 된다. 그 다음에 메타스토어에 그 함수를 등록하고 CREATE FUNCTION 구문으로 함수에 이름을 부여해야 한다.

CREATE FUNCTION strip AS 'com.hadoopbook.hive.Strip'
USING JAR '/path/to/hive-examples.jar';

하이브를 로컬에서 사용할 때는 로컬 파일 경로만 있으면 되지만, 클러스터에서 사용할 때는 반드시 JAR 파일을 HDFS에 복사하고 USING JAR 절에 HDFS URI를 지정한다.

SELECT strip(' bee ') FROM dummy;

SELECT STRIP('banana', 'ab') FROM dummy;

UDF의 이름은 대소문자를 구별하지 않는다.

SELECT STRIP(' bee ') FROM dummy;

DROP FUNCTION을 사용하여 함수를 제거할 수 있다.

DROP FUNCTION strip;

TEMPORARY 키워드를 사용하면 사용자 정의 함수를 메타스토어에 영구적으로 보관하지 않으므로 하이브 세션이 연결된 동안만 사용자 정의 함수를 사용하는 것도 물론 가능한다.

ADD JAR /path/to/hive-examples.jar;
CREATE TEMPORARY FUNCTION strip AS 'com.hadoopbook.hive.Strip';

임시 함수를 사용할 때 홈 디렉터리에 직접 만든 UDF를 선언하는 명령을 포함한 .hiverc 파일을 미리 만들어두는 것도 유용하다. 이 파일은 하이브 세션을 시작할 때 자동으로 실행된다.


시작 시점에 ADD JAR 를 호출하는 방법의 대안으로, 특정 경로를 지정하여 하이브가 클래스경로에 있는 보조 JAR 파일을 찾을 수 있도록 하는 방법도 있다(태스크 클래스경로 포함). 이러한 기법은 하이브를 실행할 때 사용자가 만든 UDF 라이브러리를 자동으로 추가하는 효과가 있다.

경로를 지정하는 두가지 방법이 있다. 첫 번째는 hive 명령에 –auxpath 옵션을 전달하는 것이다.

hive --auxpath /path/to/hive-examples.jar

두 번째는 하이브를 호출하기 전에 HIVE_AUX_JARS_PATH 환경변수를 설정하는 것이다. 보조 경로는 쉼표로 구분된 JAR 파일 경로의 목록이거나 JAR 파일이 들어 있는 디렉터리다.