ReflectUDF

ReflectUDF (Reflect 제네릭 UDF)

사용자가 Hive에서 사용하려는 정확한 기능을 처리하는 Java 클래스와 메서드가 이미 존재하는 경우가 많아요. 그 메서드를 호출하려고 래퍼(wrapper) UDF를 새로 작성할 필요 없이, 대부분의 메서드를 reflect UDF로 그대로 호출할 수 있습니다.

출처: 문서

본문

Reflect는 Java 리플렉션(reflection)을 사용해 객체의 메서드를 인스턴스화하고 호출합니다. 또한 정적(static) 함수도 호출할 수 있어요. 메서드가 반환하는 타입은 기본형(primitive)이거나 Hive가 직렬화할 수 있는 타입이어야 합니다.

SELECT reflect("java.lang.String", "valueOf", 1),
       reflect("java.lang.String", "isEmpty"),
       reflect("java.lang.Math", "max", 2, 3),
       reflect("java.lang.Math", "min", 2, 3),
       reflect("java.lang.Math", "round", 2.5),
       reflect("java.lang.Math", "exp", 1.0),
       reflect("java.lang.Math", "floor", 1.9)
FROM src LIMIT 1;

1	true	3	2	3	2.7182818284590455	1.0

Version information

Hive 0.9.0부터 java_method()reflect()의 동의어(synonym)입니다. Hive Operators and UDFs 문서의 Misc. Functions를 참고하세요.

참고로 Reflect UDF는 비결정적(non-deterministic)이에요. 같은 파라미터가 주어져도 특정 메서드가 무엇을 반환할지 보장할 수 없기 때문입니다. 따라서 WHERE 절에서 Reflect를 사용하면 Predicate Pushdown 최적화가 무효화될 수 있으니 주의하세요.

더 알아보기 (Learn more)

reflect를 쓰면 Java 표준 라이브러리의 유용한 메서드를 UDF 작성 없이 바로 활용할 수 있어요. 다만 비결정적 특성 때문에 필터 조건에서는 신중하게 사용해야 합니다.