java로 UDF 만들기1

UDF란?

hive에서 사용하는 function을 사용자가 직접 구현하는 사용자 정의 함수(user defined function)의 약자이다.

aaa 라는 형식의 데이터를 aaa**** 형식으로 변환시켜주는 UDF를 java로 구현해보자.

먼저 hive-exec.jar 라이브러리가 필요하다. 각 hive에 맞는 버전의 라이브러리를 받아서 추가한다.

코드는 아래와 같다.

// hiveudf.java

package hiveudf;

import org.apache.hadoop.hive.ql.exec.UDF;

public class test extends UDF {	
	public String evaluate(String x) throws Exception {
		
		String result = x + "****";
		return result;
	}
}

이 코드에서 중요한 부분은 method의 이름이 evaluate가 되어야 한다는 점이다. UDF의 경우 클래스 내에서 evaluate라는 method를 찾아 실행하는 것 같다. 다른 이름으로 했을 경우, hive에서 no matching method for class 에러가 나온다.

다음은 만든 java 프로젝트를 Jar 파일로 패키징한다. eclipse에서 외부 라이브러리를 포함하여 패키징 하는 방법은 다음 링크를 참조하면 된다.

외부 라이브러리를 포함하여 jar파일 생성

생성한 jar 파일을 hadoop 안에 넣어준다. (hadoop에 넣지 않고 로컬의 경로로 jar 파일을 hive에 추가해 주려고 했지만 실패했다.)

$ hadoop fs -put test.jar /temp/jar/

이제 hive로 가서 jar 파일을 추가하여 함수를 만들자.

(혹시 잘 안된다면 hive에서 나갔다가 들어와서 다시 해보니 정상적으로 함수가 생성되었다. 전에 메모리가 남아있었던 것으로 의심된다.)

hive> create temporary function test as 'hiveudf.test' using jar 'hdfs:///temp/jar/test.jar'

test라는 함수가 새로 만들어졌다. 사용해보자.

hive> select test('aa');  # aa****

결과가 주석과 같이 나오면 성공이다.

Leave a comment