Hive 연산자와 사용자 정의 함수

Hive 연산자와 사용자 정의 함수 (LanguageManual Operators and UDF)

이 문서는 Hive의 내장 연산자(관계·산술·논리·복합 타입 등)와 내장 함수(수학·컬렉션·타입 변환·날짜·조건·문자열·마스킹·기타), UDAF·UDTF를 모두 정리한 완전한 레퍼런스예요. 함수 이름과 코드는 그대로 두고 설명 중심으로 정리했어요.

출처: 문서

본문

개요

Hive 연산자와 함수 이름을 포함한 모든 Hive 키워드는 대소문자를 구분하지 않습니다.

Beeline 또는 CLI에서 다음 명령을 사용해 최신 문서를 확인할 수 있습니다:

SHOW FUNCTIONS;
DESCRIBE FUNCTION <function_name>;
DESCRIBE FUNCTION EXTENDED <function_name>;

UDF가 UDF·함수에 중첩될 때의 표현식 캐싱 버그

hive.cache.expr.evaluation이 true로 설정되면(기본값) UDF가 다른 UDF나 Hive 함수에 중첩될 때 잘못된 결과를 줄 수 있습니다. 이 버그는 0.12.0, 0.13.0, 0.13.1 릴리스에 영향을 줍니다. 0.14.0 릴리스에서 버그가 수정되었습니다(HIVE-7314).

이 문제는 Hive 사용자 메일링 리스트에서 논의된 UDF의 getDisplayString 메서드 구현과 관련이 있습니다.

내장 연산자

연산자 우선순위

예제 연산자 설명
A[B], A.identifier bracket_op([]), dot(.) 요소 선택기, 점
-A unary(+), unary(-), unary(~) 단항 접두 연산자
A IS [NOT] (NULL|TRUE|FALSE)
A ^ B bitwise xor(^) 비트 XOR
A * B star(*), divide(/), mod(%), div(DIV) 곱셈 연산자
A + B plus(+), minus(-) 덧셈 연산자
A | B
A & B bitwise and(&) 비트 AND
A | B bitwise or(|) 비트 OR

관계 연산자

다음 연산자는 전달된 피연산자를 비교하고 피연산자 간의 비교가 성립하는지에 따라 TRUE 또는 FALSE 값을 생성합니다.

연산자 피연산자 타입 설명
A = B 모든 기본 타입 표현식 A가 표현식 B와 같으면 TRUE, 그렇지 않으면 FALSE.
A == B 모든 기본 타입 = 연산자의 동의어.
A <=> B 모든 기본 타입 non-null 피연산자에 대해 EQUAL(=) 연산자와 같은 결과를 반환하지만, 둘 다 NULL이면 TRUE, 하나만 NULL이면 FALSE를 반환합니다. (버전 0.9.0부터.)
A <> B 모든 기본 타입 A 또는 B가 NULL이면 NULL, 표현식 A가 B와 같지 않으면 TRUE, 그렇지 않으면 FALSE.
A != B 모든 기본 타입 <> 연산자의 동의어.
A < B 모든 기본 타입 A 또는 B가 NULL이면 NULL, A가 B보다 작으면 TRUE, 그렇지 않으면 FALSE.
A <= B 모든 기본 타입 A 또는 B가 NULL이면 NULL, A가 B보다 작거나 같으면 TRUE, 그렇지 않으면 FALSE.
A > B 모든 기본 타입 A 또는 B가 NULL이면 NULL, A가 B보다 크면 TRUE, 그렇지 않으면 FALSE.
A >= B 모든 기본 타입 A 또는 B가 NULL이면 NULL, A가 B보다 크거나 같으면 TRUE, 그렇지 않으면 FALSE.
A [NOT] BETWEEN B AND C 모든 기본 타입 A, B, C 중 하나라도 NULL이면 NULL, A가 B보다 크거나 같고 C보다 작거나 같으면 TRUE, 그렇지 않으면 FALSE. NOT 키워드로 반전할 수 있습니다. (버전 0.9.0부터.)
A IS NULL 모든 타입 표현식 A가 NULL이면 TRUE, 그렇지 않으면 FALSE.
A IS NOT NULL 모든 타입 표현식 A가 NULL이면 FALSE, 그렇지 않으면 TRUE.
A IS [NOT] (TRUE|FALSE) boolean
A [NOT] LIKE B 문자열 A 또는 B가 NULL이면 NULL, 문자열 A가 SQL 단순 정규식 B와 일치하면 TRUE, 그렇지 않으면 FALSE. 비교는 문자별로 수행됩니다. B의 _ 문자는 A의 모든 문자와 일치하고(posix 정규식의 .와 유사), B의 % 문자는 A의 임의 개수 문자와 일치합니다(posix 정규식의 .*와 유사). 예를 들어 'foobar' like 'foo'는 FALSE, 'foobar' like 'foo_ _ _'와 'foobar' like 'foo%'는 TRUE입니다.
A RLIKE B 문자열 A 또는 B가 NULL이면 NULL, A의 (아마 빈) 부분 문자열이 Java 정규식 B와 일치하면 TRUE, 그렇지 않으면 FALSE. 예: 'foobar' RLIKE 'foo'는 TRUE, 'foobar' RLIKE '^f.*r$'도 TRUE.
A REGEXP B 문자열 RLIKE와 동일.

산술 연산자

다음 연산자는 피연산자에 대한 다양한 일반 산술 연산을 지원합니다. 모두 숫자 타입을 반환합니다. 피연산자 중 하나라도 NULL이면 결과도 NULL입니다.

연산자 피연산자 타입 설명
A + B 모든 숫자 타입 A와 B를 더한 결과를 제공합니다. 결과 타입은 피연산자 타입의 공통 부모(타입 계층에서)와 같습니다. 예를 들어 모든 정수는 float이므로 float은 정수의 포함 타입이라, float과 int에 대한 + 연산자는 float을 결과로 냅니다.
A - B 모든 숫자 타입 B에서 A를 뺀 결과를 제공합니다. 결과 타입은 피연산자 타입의 공통 부모와 같습니다.
A * B 모든 숫자 타입 A와 B를 곱한 결과를 제공합니다. 결과 타입은 피연산자 타입의 공통 부모와 같습니다. 곱셈이 오버플로를 일으키면 연산자 중 하나를 타입 계층에서 더 높은 타입으로 캐스팅해야 합니다.
A / B 모든 숫자 타입 A를 B로 나눈 결과를 제공합니다. 대부분의 경우 결과는 double 타입입니다. A와 B가 모두 정수일 때 결과는 double 타입이며, hive.compat 구성 파라미터가 "0.13" 또는 "latest"로 설정된 경우에만 decimal 타입입니다.
A DIV B 정수 타입 A를 B로 나눈 결과의 정수 부분을 제공합니다. 예: 17 div 3은 5.
A % B 모든 숫자 타입 A를 B로 나눈 나머지를 제공합니다. 결과 타입은 피연산자 타입의 공통 부모와 같습니다.
A & B 모든 숫자 타입 A와 B의 비트 AND 결과를 제공합니다. 결과 타입은 피연산자 타입의 공통 부모와 같습니다.
A | B 모든 숫자 타입
A ^ B 모든 숫자 타입 A와 B의 비트 XOR 결과를 제공합니다. 결과 타입은 피연산자 타입의 공통 부모와 같습니다.
~A 모든 숫자 타입 A의 비트 NOT 결과를 제공합니다. 결과 타입은 A의 타입과 같습니다.

논리 연산자

다음 연산자는 논리 표현식 생성을 지원합니다. 모두 피연산자의 boolean 값에 따라 boolean TRUE, FALSE 또는 NULL을 반환합니다. NULL은 "알 수 없음" 플래그로 동작하므로, 결과가 알 수 없음의 상태에 의존하면 결과 자체도 알 수 없습니다.

연산자 피연산자 타입 설명
A AND B boolean A와 B가 모두 TRUE이면 TRUE, 그렇지 않으면 FALSE. A 또는 B가 NULL이면 NULL.
A OR B boolean A 또는 B(둘 다 포함)가 TRUE이면 TRUE, FALSE OR NULL은 NULL, 그렇지 않으면 FALSE.
NOT A boolean A가 FALSE이면 TRUE, A가 NULL이면 NULL. 그렇지 않으면 FALSE.
! A boolean NOT A와 동일.
A IN (val1, val2, …) boolean A가 값 중 어느 하나와 같으면 TRUE. Hive 0.13부터 IN 문에서 subqueries가 지원됩니다.
A NOT IN (val1, val2, …) boolean A가 값 중 어느 하나와도 같지 않으면 TRUE. Hive 0.13부터 NOT IN 문에서도 subqueries가 지원됩니다.
[NOT] EXISTS (subquery) 서브쿼리가 최소한 한 행을 반환하면 TRUE. Hive 0.13부터 지원.

문자열 연산자

연산자 피연산자 타입 설명
A | B

복합 타입 생성자

다음 함수는 복합 타입의 인스턴스를 생성합니다.

생성자 함수 피연산자 설명
map (key1, value1, key2, value2, …) 주어진 키/값 쌍으로 map을 만듭니다.
struct (val1, val2, val3, …) 주어진 필드 값으로 struct를 만듭니다. struct 필드 이름은 col1, col2, … 가 됩니다.
named_struct (name1, val1, name2, val2, …) 주어진 필드 이름과 값으로 struct를 만듭니다. (Hive 0.8.0부터.)
array (val1, val2, …) 주어진 요소로 array를 만듭니다.
create_union (tag, val1, val2, …) tag 매개변수가 가리키는 값을 가진 union 타입을 만듭니다.

복합 타입에 대한 연산자

다음 연산자는 복합 타입의 요소에 접근하는 메커니즘을 제공합니다.

연산자 피연산자 타입 설명
A[n] A는 Array이고 n은 int 배열 A의 n번째 요소를 반환합니다. 첫 번째 요소의 인덱스는 0입니다. 예를 들어 A가 ['foo','bar']로 구성된 배열이면 A[0]는 'foo', A[1]은 'bar'를 반환합니다.
M[key] M은 Map<K,V>이고 key는 타입 K 맵에서 키에 해당하는 값을 반환합니다. 예를 들어 M이 {'f' -> 'foo', 'b' -> 'bar', 'all' -> 'foobar'}로 구성된 맵이면 M['all']은 'foobar'를 반환합니다.
S.x S는 struct S의 x 필드를 반환합니다. 예를 들어 struct foobar {int foo, int bar}에 대해 foobar.foo는 struct의 foo 필드에 저장된 정수를 반환합니다.

내장 함수

수학 함수

다음 내장 수학 함수가 Hive에서 지원됩니다. 대부분 인자가 NULL이면 NULL을 반환합니다:

반환 타입 이름(시그니처) 설명
DOUBLE round(DOUBLE a) a의 반올림된 BIGINT 값을 반환합니다.
DOUBLE round(DOUBLE a, INT d) 소수 d자리로 반올림한 a를 반환합니다.
DOUBLE bround(DOUBLE a) HALF_EVEN 반올림 모드를 사용해 a의 반올림된 BIGINT 값을 반환합니다(Hive 1.3.0, 2.0.0부터). 가우스 반올림 또는 은행가 반올림이라고도 합니다. 예: bround(2.5) = 2, bround(3.5) = 4.
DOUBLE bround(DOUBLE a, INT d) HALF_EVEN 반올림 모드를 사용해 소수 d자리로 반올림한 a를 반환합니다(Hive 1.3.0, 2.0.0부터). 예: bround(8.25, 1) = 8.2, bround(8.35, 1) = 8.4.
BIGINT floor(DOUBLE a) a와 같거나 작은 최대 BIGINT 값을 반환합니다.
BIGINT ceil(DOUBLE a), ceiling(DOUBLE a) a와 같거나 큰 최소 BIGINT 값을 반환합니다.
DOUBLE rand(), rand(INT seed) 0에서 1까지 균일하게 분포하는(행마다 변하는) 난수를 반환합니다. 시드를 지정하면 난수 시퀀스가 결정적이도록 보장합니다.
DOUBLE exp(DOUBLE a), exp(DECIMAL a) e가 자연로그의 밑일 때 ea를 반환합니다. decimal 버전은 Hive 0.13.0에 추가.
DOUBLE ln(DOUBLE a), ln(DECIMAL a) 인자 a의 자연로그를 반환합니다. decimal 버전은 Hive 0.13.0에 추가.
DOUBLE log10(DOUBLE a), log10(DECIMAL a) 인자 a의 밑이 10인 로그를 반환합니다. decimal 버전은 Hive 0.13.0에 추가.
DOUBLE log2(DOUBLE a), log2(DECIMAL a) 인자 a의 밑이 2인 로그를 반환합니다. decimal 버전은 Hive 0.13.0에 추가.
DOUBLE log(DOUBLE base, DOUBLE a)log(DECIMAL base, DECIMAL a) 인자 a의 밑이 base인 로그를 반환합니다. decimal 버전은 Hive 0.13.0에 추가.
DOUBLE pow(DOUBLE a, DOUBLE p), power(DOUBLE a, DOUBLE p) ap를 반환합니다.
DOUBLE sqrt(DOUBLE a), sqrt(DECIMAL a) a의 제곱근을 반환합니다. decimal 버전은 Hive 0.13.0에 추가.
STRING bin(BIGINT a) 이진 형식의 숫자를 반환합니다(http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_bin 참고).
STRING hex(BIGINT a) hex(STRING a) hex(BINARY a) 인자가 INT 또는 binary이면 hex는 숫자를 16진수 형식의 STRING으로 반환합니다. 숫자가 STRING이면 각 문자를 16진수 표현으로 변환해 결과 STRING을 반환합니다.
BINARY unhex(STRING a) hex의 역. 각 문자 쌍을 16진수 숫자로 해석해 숫자의 바이트 표현으로 변환합니다.
STRING conv(BIGINT num, INT from_base, INT to_base), conv(STRING num, INT from_base, INT to_base) 주어진 밑에서 다른 밑으로 숫자를 변환합니다.
DOUBLE abs(DOUBLE a) 절댓값을 반환합니다.
INT 또는 DOUBLE pmod(INT a, INT b), pmod(DOUBLE a, DOUBLE b) a mod b의 양수 값을 반환합니다.
DOUBLE sin(DOUBLE a), sin(DECIMAL a) a의 사인을 반환합니다(a는 라디안).
DOUBLE asin(DOUBLE a), asin(DECIMAL a) -1<=a<=1이면 a의 아크사인을, 그렇지 않으면 NULL을 반환합니다.
DOUBLE cos(DOUBLE a), cos(DECIMAL a) a의 코사인을 반환합니다(a는 라디안).
DOUBLE acos(DOUBLE a), acos(DECIMAL a) -1<=a<=1이면 a의 아크코사인을, 그렇지 않으면 NULL을 반환합니다.
DOUBLE tan(DOUBLE a), tan(DECIMAL a) a의 탄젠트를 반환합니다(a는 라디안).
DOUBLE atan(DOUBLE a), atan(DECIMAL a) a의 아크탄젠트를 반환합니다.
DOUBLE degrees(DOUBLE a), degrees(DECIMAL a) a의 값을 라디안에서 도로 변환합니다.
DOUBLE radians(DOUBLE a), radians(DOUBLE a) a의 값을 도에서 라디안으로 변환합니다.
INT 또는 DOUBLE positive(INT a), positive(DOUBLE a) a를 반환합니다.
INT 또는 DOUBLE negative(INT a), negative(DOUBLE a) -a를 반환합니다.
DOUBLE 또는 INT sign(DOUBLE a), sign(DECIMAL a) a의 부호를 '1.0'(양수) 또는 '-1.0'(음수), 그 외에는 '0.0'으로 반환합니다. decimal 버전은 DOUBLE 대신 INT를 반환합니다.
DOUBLE e() e의 값을 반환합니다.
DOUBLE pi() pi의 값을 반환합니다.
BIGINT factorial(INT a) a의 팩토리얼을 반환합니다(Hive 1.2.0부터). 유효한 a는 [0..20].
DOUBLE cbrt(DOUBLE a) double 값 a의 세제곱근을 반환합니다(Hive 1.2.0부터).
INTBIGINT shiftleft(TINYINT|SMALLINT|INT a, INT b)
INTBIGINT shiftright(TINYINT|SMALLINT|INT a, INT b)
INTBIGINT shiftrightunsigned(TINYINT|SMALLINT|INT a, INT b)
T greatest(T v1, T v2, …) 값 목록의 최댓값을 반환합니다(Hive 1.1.0부터). 하나 이상의 인자가 NULL이면 NULL을 반환하도록 수정되었고, ">" 연산자와 일치하도록 엄격한 타입 제한이 완화되었습니다(Hive 2.0.0부터).
T least(T v1, T v2, …) 값 목록의 최솟값을 반환합니다(Hive 1.1.0부터). 하나 이상의 인자가 NULL이면 NULL을 반환하도록 수정되었고, "<" 연산자와 일치하도록 엄격한 타입 제한이 완화되었습니다(Hive 2.0.0부터).
INT width_bucket(NUMERIC expr, NUMERIC min_value, NUMERIC max_value, INT num_buckets) expr을 i번째 균등 크기 버킷에 매핑해 0과 num_buckets+1 사이의 정수를 반환합니다. 버킷은 [min_value, max_value]를 균등 크기 영역으로 나눠 만듭니다. expr < min_value이면 1, expr > max_value이면 num_buckets+1을 반환합니다. (Hive 3.0.0부터.)

Decimal 데이터 타입에 대한 수학 함수와 연산자

decimal 데이터 타입은 Hive 0.11.0(HIVE-2693)에서 도입되었습니다.

모든 일반 산술 연산자(+,-,*,/ 등)와 관련 수학 UDF(Floor, Ceil, Round 등)가 decimal 타입을 처리하도록 업데이트되었습니다. 지원 UDF 목록은 Hive Data TypesMathematical UDFs를 참고하세요.

컬렉션 함수

다음 내장 컬렉션 함수가 Hive에서 지원됩니다:

반환 타입 이름(시그니처) 설명
int size(Map<K.V>) 맵 타입의 요소 수를 반환합니다.
int size(Array) 배열 타입의 요소 수를 반환합니다.
array map_keys(Map<K.V>) 입력 맵의 키를 포함하는 비정렬 배열을 반환합니다.
array map_values(Map<K.V>) 입력 맵의 값을 포함하는 비정렬 배열을 반환합니다.
boolean array_contains(Array, value) 배열이 value를 포함하면 TRUE를 반환합니다.
array sort_array(Array) 배열 요소의 자연 순서에 따라 입력 배열을 오름차순으로 정렬해 반환합니다(버전 0.9.0부터).

타입 변환 함수

다음 타입 변환 함수가 Hive에서 지원됩니다:

반환 타입 이름(시그니처) 설명
binary binary(string|binary)
타입 cast(expr as ) 표현식 expr의 결과를 으로 변환합니다. 예: cast('1' as BIGINT)는 문자열 '1'을 정수 표현으로 변환합니다. 변환 실패 시 null을 반환합니다. cast(expr as boolean)의 경우 Hive는 비어 있지 않은 문자열에 대해 true를 반환합니다.

날짜 함수

다음 내장 날짜 함수가 Hive에서 지원됩니다:

반환 타입 이름(시그니처) 설명
string from_unixtime(bigint unixtime[, string pattern]) 에포크(1970-01-01 00:00:00 UTC) 이후의 초 수를 지정된 패턴을 사용해 현재 시간대의 해당 순간의 타임스탬프를 나타내는 문자열로 변환합니다(hive.local.time.zone 구성 사용). 패턴이 없으면 기본값('yyyy-MM-dd HH:mm:ss')이 사용됩니다. 예: from_unixtime(0)=1970-01-01 00:00:00 (hive.local.time.zone=Etc/GMT). Hive 4.0.0부터 "hive.datetime.formatter" 속성으로 기본 formatter 구현과 그에 따른 허용 패턴·동작을 제어할 수 있습니다.
bigint unix_timestamp() 현재 Unix 타임스탬프를 초 단위로 가져옵니다. 이 함수는 결정적이지 않으며 그 값이 쿼리 실행 범위에 대해 고정되지 않아 쿼리 최적화를 방해합니다. 2.0부터 CURRENT_TIMESTAMP 상수를 위해 deprecated 되었습니다.
bigint unix_timestamp(string date) 기본 패턴을 사용해 datetime 문자열을 unix time(에포크 이후 초)으로 변환합니다. 허용되는 기본 패턴은 기본 formatter 구현에 따라 달라집니다. datetime 문자열에는 시간대가 없으므로 "hive.local.time.zone" 속성으로 지정된 로컬 시간대를 사용합니다. 변환 실패 시 null을 반환합니다. 예: unix_timestamp('2009-03-20 11:30:01') = 1237573801.
bigint unix_timestamp(string date, string pattern) 지정된 패턴을 사용해 datetime 문자열을 unix time(에포크 이후 초)으로 변환합니다. 허용되는 패턴과 동작은 기본 formatter 구현에 따라 다릅니다. 변환 실패 시 null을 반환합니다. 예: unix_timestamp('2009-03-20', 'uuuu-MM-dd') = 1237532400.
pre 2.1.0: string / 2.1.0 on: date to_date(string timestamp) 타임스탬프의 날짜 부분을 반환합니다(Hive 2.1.0 이전): to_date("1970-01-01 00:00:00") = "1970-01-01". Hive 2.1.0부터 날짜 객체를 반환합니다.
int year(string date) 날짜 또는 타임스탬프 문자열의 연도 부분을 반환합니다: year("1970-01-01 00:00:00") = 1970, year("1970-01-01") = 1970.
int quarter(date/timestamp/string) 날짜, 타임스탬프 또는 문자열에 대해 연도의 분기를 1~4 범위로 반환합니다(Hive 1.3.0부터). 예: quarter('2015-04-08') = 2.
int month(string date) 날짜 또는 타임스탬프 문자열의 월 부분을 반환합니다: month("1970-11-01 00:00:00") = 11, month("1970-11-01") = 11.
int day(string date) dayofmonth(date) 날짜 또는 타임스탬프 문자열의 일 부분을 반환합니다: day("1970-11-01 00:00:00") = 1, day("1970-11-01") = 1.
int hour(string date) 타임스탬프의 시를 반환합니다: hour('2009-07-30 12:58:59') = 12, hour('12:58:59') = 12.
int minute(string date) 타임스탬프의 분을 반환합니다.
int second(string date) 타임스탬프의 초를 반환합니다.
int weekofyear(string date) 타임스탬프 문자열의 주 번호를 반환합니다: weekofyear("1970-11-01 00:00:00") = 44, weekofyear("1970-11-01") = 44.
int extract(field FROM source) source에서 일이나 시 같은 필드를 검색합니다(Hive 2.2.0부터). source는 date, timestamp, interval 또는 date나 timestamp로 변환 가능한 문자열이어야 합니다. 지원 필드: day, dayofweek, hour, minute, month, quarter, second, week, year. 예: 1. select extract(month from "2016-10-20")는 10. 2. select extract(hour from "2016-10-20 05:06:07")는 5. 3. select extract(dayofweek from "2016-10-20 05:06:07")는 5. 4. select extract(month from interval '1-3' year to month)는 3. 5. select extract(minute from interval '3 12:20:30' day to second)는 20.
int datediff(string enddate, string startdate) startdate에서 enddate까지의 일 수를 반환합니다: datediff('2009-03-01', '2009-02-27') = 2.
pre 2.1.0: string / 2.1.0 on: date date_add(date/timestamp/string startdate, tinyint/smallint/int days) startdate에 일 수를 더합니다: date_add('2008-12-31', 1) = '2009-01-01'.
pre 2.1.0: string / 2.1.0 on: date date_sub(date/timestamp/string startdate, tinyint/smallint/int days) startdate에서 일 수를 뺍니다: date_sub('2008-12-31', 1) = '2008-12-30'.
timestamp from_utc_timestamp({any primitive type} ts, string timezone) UTC의 타임스탬프를 주어진 시간대로 변환합니다(Hive 0.8.0부터). * timestamp는 기본 타입으로 timestamp/date, tinyint/smallint/int/bigint, float/double, decimal을 포함합니다. 소수 값은 초로, 정수 값은 밀리초로 간주됩니다. 예: from_utc_timestamp(2592000.0,'PST'), from_utc_timestamp(2592000000,'PST'), from_utc_timestamp(timestamp '1970-01-30 16:00:00','PST') 모두 타임스탬프 1970-01-30 08:00:00을 반환합니다.
timestamp to_utc_timestamp({any primitive type} ts, string timezone) 주어진 시간대의 타임스탬프를 UTC로 변환합니다(Hive 0.8.0부터). 소수 값은 초로, 정수 값은 밀리초로 간주됩니다. 예: to_utc_timestamp(2592000.0,'PST'), to_utc_timestamp(2592000000,'PST'), to_utc_timestamp(timestamp '1970-01-30 16:00:00','PST') 모두 타임스탬프 1970-01-31 00:00:00을 반환합니다.
date current_date 쿼리 평가 시작 시점의 현재 날짜를 반환합니다(Hive 1.2.0부터). 같은 쿼리 내의 모든 current_date 호출은 같은 값을 반환합니다.
timestamp current_timestamp 쿼리 평가 시작 시점의 현재 타임스탬프를 반환합니다(Hive 1.2.0부터). 같은 쿼리 내의 모든 current_timestamp 호출은 같은 값을 반환합니다.
string add_months(string start_date, int num_months, output_date_format) start_date 이후 num_months 개월 후의 날짜를 반환합니다(Hive 1.1.0부터). start_date는 string, date 또는 timestamp입니다. num_months는 정수입니다. start_date가 월의 마지막 날이거나 결과 월이 start_date의 일 구성요소보다 적은 일수를 가지면 결과는 결과 월의 마지막 날입니다. 그렇지 않으면 결과는 start_date와 같은 일 구성요소를 갖습니다. 기본 출력 형식은 'yyyy-MM-dd'. Hive 4.0.0부터 add_months는 선택 인자 output_date_format을 지원합니다. 예: add_months('2009-08-31', 1)은 '2009-09-30', add_months('2017-12-31 14:15:16', 2, 'yyyy-MM-dd HH:mm:ss')은 '2018-02-28 14:15:16'.
string last_day(string date) date가 속한 달의 마지막 날을 반환합니다(Hive 1.1.0부터). date는 'yyyy-MM-dd HH:mm:ss' 또는 'yyyy-MM-dd' 형식의 문자열. date의 시간 부분은 무시됩니다.
string next_day(string start_date, string day_of_week) start_date보다 나중이고 day_of_week라는 이름을 가진 첫 번째 날짜를 반환합니다(Hive 1.2.0부터). start_date는 string/date/timestamp. day_of_week는 요일의 2글자, 3글자 또는 전체 이름(예: Mo, tue, FRIDAY). start_date의 시간 부분은 무시됩니다. 예: next_day('2015-01-14', 'TU') = 2015-01-20.
string trunc(string date, string format) format이 지정하는 단위로 잘린 날짜를 반환합니다(Hive 1.2.0부터). 지원 형식: MONTH/MON/MM, YEAR/YYYY/YY. 예: trunc('2015-03-17', 'MM') = 2015-03-01.
double months_between(date1, date2) date1과 date2 사이의 개월 수를 반환합니다(Hive 1.2.0부터). date1이 date2보다 나중이면 양수, 이르면 음수. date1과 date2가 같은 월의 일이거나 둘 다 월의 마지막 날이면 결과는 항상 정수. 그렇지 않으면 31일 기준 월에 기반해 소수 부분을 계산합니다. result는 소수 8자리로 반올림됩니다. 예: months_between('1997-02-28 10:30:00', '1996-10-30') = 3.94959677.
string date_format(date/timestamp/string ts, string pattern) 지정된 패턴을 사용해 date/timestamp/string을 문자열 값으로 변환합니다(Hive 1.2.0부터). 패턴 인자는 상수여야 합니다. 예: date_format('2015-04-08', 'y') = '2015'. date_format으로 다른 UDF를 구현할 수 있습니다: * dayname(date) 는 date_format(date, 'EEEE')

조건 함수

반환 타입 이름(시그니처) 설명
T if(boolean testCondition, T valueTrue, T valueFalseOrNull) testCondition이 true이면 valueTrue를, 그렇지 않으면 valueFalseOrNull을 반환합니다.
boolean isnull(a) a가 NULL이면 true, 그렇지 않으면 false.
boolean isnotnull(a) a가 NULL이 아니면 true, 그렇지 않으면 false.
T nvl(T value, T default_value) value가 null이면 반환 기본값을, 그렇지 않으면 value를 반환합니다(Hive 0.11부터).
T COALESCE(T v1, T v2, …) NULL이 아닌 첫 번째 v를 반환하거나, 모든 v가 NULL이면 NULL.
T CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END a = b이면 c, a = d이면 e, 그 외에는 f.
T CASE WHEN a THEN b [WHEN c THEN d]* [ELSE e] END a = true이면 b, c = true이면 d, 그 외에는 e.
T nullif(a, b) a=b이면 NULL, 그렇지 않으면 a(Hive 2.3.0부터). CASE WHEN a = b then NULL else a 의 약칭.
void assert_true(boolean condition) 'condition'이 true가 아니면 예외를 던지고, 그렇지 않으면 null(Hive 0.8.0부터). 예: select assert_true(2<1).

문자열 함수

다음 내장 문자열 함수가 Hive에서 지원됩니다:

반환 타입 이름(시그니처) 설명
int ascii(string str) str의 첫 번째 문자의 숫자 값을 반환합니다.
string base64(binary bin) 인자를 binary에서 base 64 문자열로 변환합니다(Hive 0.12.0부터).
int character_length(string str) str에 포함된 UTF-8 문자 수를 반환합니다(Hive 2.2.0부터). char_length 함수는 이 함수의 약칭입니다.
string chr(bigint|double A)
string concat(string|binary A, string|binary B…)
array<struct<string,double>> context_ngrams(array<array>, array, int K, int pf) "context" 문자열이 주어졌을 때 토큰화된 문장 집합에서 상위 k 문맥 N-gram을 반환합니다. 자세한 내용은 StatisticsAndDataMining을 참고하세요.
string concat_ws(string SEP, string A, string B…) 위의 concat()과 같지만 커스텀 구분자 SEP를 사용합니다.
string concat_ws(string SEP, array) 위의 concat_ws()와 같지만 문자열 배열을 받습니다(Hive 0.9.0부터).
string decode(binary bin, string charset) 제공된 문자셋('US-ASCII','ISO-8859-1','UTF-8','UTF-16BE','UTF-16LE','UTF-16' 중 하나)을 사용해 첫 번째 인자를 String으로 디코딩합니다. 어느 인자든 null이면 결과도 null. (Hive 0.12.0부터.)
string elt(N int, str1 string, str2 string, str3 string,…) 인덱스 번호에 해당하는 문자열을 반환합니다. 예: elt(2,'hello','world')는 'world'. N이 1보다 작거나 인자 수보다 크면 NULL.
binary encode(string src, string charset) 제공된 문자셋을 사용해 첫 번째 인자를 BINARY로 인코딩합니다. 어느 인자든 null이면 결과도 null. (Hive 0.12.0부터.)
int field(val T, val1 T, val2 T, val3 T,…) val1,val2,val3,… 목록에서 val의 인덱스를 반환하거나 찾지 못하면 0. 예: field('world','say','hello','world')는 3. 모든 기본 타입이 지원되며 str.equals(x)로 비교됩니다. val이 NULL이면 0.
int find_in_set(string str, string strList) strList(쉼표로 구분된 문자열)에서 str의 첫 번째 발생을 반환합니다. 어느 인자든 null이면 null. 첫 번째 인자에 쉼표가 포함되면 0. 예: find_in_set('ab', 'abc,b,ab,c,def')는 3.
string format_number(number x, int d) 숫자 X를 '###,###.##' 같은 형식으로 포맷하고 D 소수 자릿수로 반올림해 문자열로 반환합니다. D가 0이면 소수점이 없습니다. (Hive 0.10.0부터.)
string get_json_object(string json_string, string path) 지정된 json path에 따라 json 문자열에서 객체를 추출해 추출된 json 객체의 문자열을 반환합니다. 입력 json 문자열이 잘못되면 null. 참고: json path는 [0-9a-z_] 문자만 가질 수 있으며, 대문자나 특수 문자는 안 됩니다. 또한 키는 숫자로 시작할 수 없습니다. 이는 Hive 컬럼 이름 제한 때문입니다.
boolean in_file(string str, string filename) str 문자열이 filename에 전체 줄로 나타나면 true.
int instr(string str, string substr) str에서 substr이 처음 나타나는 위치를 반환합니다. 어느 인자든 null이면 null, 못 찾으면 0. 이것은 0부터 시작하지 않습니다. str의 첫 문자 인덱스는 1.
int length(string A) 문자열의 길이를 반환합니다.
int locate(string substr, string str[, int pos]) str에서 위치 pos 이후에 substr이 처음 나타나는 위치를 반환합니다.
string lower(string A) lcase(string A) B의 모든 문자를 소문자로 변환한 결과 문자열을 반환합니다. 예: lower('fOoBaR')은 'foobar'.
string lpad(string str, int len, string pad) str을 pad로 왼쪽 패딩해 길이 len으로 만든 결과를 반환합니다. str이 len보다 길면 반환 값은 len 문자로 잘립니다. pad 문자열이 비어 있으면 null.
string ltrim(string A) A의 앞(왼쪽)에서 공백을 제거한 결과 문자열을 반환합니다. 예: ltrim(' foobar ')는 'foobar '.
array<struct<string,double>> ngrams(array<array>, int N, int K, int pf) sentences() UDAF가 반환하는 것 같은 토큰화된 문장 집합에서 상위 k N-gram을 반환합니다. 자세한 내용은 StatisticsAndDataMining을 참고하세요.
int octet_length(string str) str을 UTF-8로 담는 데 필요한 옥텟 수를 반환합니다(Hive 2.2.0부터). octet_length(str)는 character_length(str)보다 클 수 있습니다.
string parse_url(string urlString, string partToExtract [, string keyToExtract]) URL에서 지정된 부분을 반환합니다. partToExtract의 유효한 값: HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE, USERINFO. 예: parse_url('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'HOST')는 'facebook.com'. 세 번째 인자로 키를 제공해 QUERY에서 특정 키의 값을 추출할 수 있습니다. 예: parse_url('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'QUERY', 'k1')는 'v1'.
string printf(String format, Obj… args) printf 스타일 포맷 문자열에 따라 입력을 포맷해 반환합니다(Hive 0.9.0부터).
string quote(String text) 인용된 문자열을 반환합니다(작은따옴표에 대한 이스케이프 문자 포함, HIVE-4.0.0).

quote 예:

입력 출력
NULL NULL
DONT 'DONT'
DON'T 'DON'T'
반환 타입 이름(시그니처) 설명
string regexp_extract(string subject, string pattern, int index) 패턴을 사용해 추출한 문자열을 반환합니다. 예: regexp_extract('foothebar', 'foo(.*?)(bar)', 2)는 'bar'. 미리 정의된 문자 클래스 사용에 주의가 필요합니다. 'index' 매개변수는 Java regex Matcher group() 메서드 인덱스.
string regexp_replace(string INITIAL_STRING, string PATTERN, string REPLACEMENT) INITIAL_STRING에서 PATTERN에 정의된 Java 정규식 문법과 일치하는 모든 부분 문자열을 REPLACEMENT로 바꾼 결과 문자열을 반환합니다. 예: regexp_replace("foobar", "oo|ar", "")는 'fb'.
string repeat(string str, int n) str을 n번 반복합니다.
string replace(string A, string OLD, string NEW) OLD의 겹치지 않는 모든 발생을 NEW로 바꾼 문자열 A를 반환합니다(Hive 1.3.0, 2.1.0부터). 예: select replace("ababab", "abab", "Z"); 는 "Zab".
string reverse(string A) 뒤집힌 문자열을 반환합니다.
string rpad(string str, int len, string pad) str을 pad로 오른쪽 패딩해 길이 len으로 만든 결과를 반환합니다. str이 len보다 길면 len 문자로 잘립니다. pad가 비어 있으면 null.
string rtrim(string A) A의 끝(오른쪽)에서 공백을 제거한 결과 문자열을 반환합니다. 예: rtrim(' foobar ')는 ' foobar'.
array<array> sentences(string str, string lang, string locale) 자연어 텍스트를 단어와 문장으로 토큰화합니다. 각 문장은 적절한 문장 경계에서 끊어져 단어 배열로 반환됩니다. 'lang'과 'locale'은 선택 인자. 예: sentences('Hello there! How are you?')는 (("Hello","there"), ("How","are","you")).
string space(int n) n개의 공백으로 이루어진 문자열을 반환합니다.
array split(string str, string pat) str을 pat(정규식) 기준으로 나눕니다.
map<string,string> str_to_map(text[, delimiter1, delimiter2]) 두 개의 구분자를 사용해 text를 키-값 쌍으로 나눕니다. Delimiter1은 text를 K-V 쌍으로, Delimiter2는 각 K-V 쌍을 나눕니다. 기본 구분자는 delimiter1이 ','이고 delimiter2가 ':'.
string substr(string|binary A, int start) substring(string|binary A, int start)
string substr(string|binary A, int start, int len) substring(string|binary A, int start, int len)
string substring_index(string A, string delim, int count) 구분자 delim의 count번째 발생 전까지 문자열 A의 부분 문자열을 반환합니다(Hive 1.3.0부터). count가 양수이면 마지막 구분자의 왼쪽, 음수이면 마지막 구분자의 오른쪽. 대소문자 구분. 예: substring_index('www.apache.org', '.', 2) = 'www.apache'.
string translate(string|char|varchar input, string|char|varchar from, string|char|varchar to)
string trim(string A) A의 양쪽 끝에서 공백을 제거한 결과 문자열을 반환합니다. 예: trim(' foobar ')는 'foobar'.
binary unbase64(string str) 인자를 base 64 문자열에서 BINARY로 변환합니다. (Hive 0.12.0부터.)
string upper(string A) ucase(string A) A의 모든 문자를 대문자로 변환한 결과 문자열을 반환합니다. 예: upper('fOoBaR')은 'FOOBAR'.
string initcap(string A) 각 단어의 첫 글자는 대문자, 나머지는 소문자로 한 문자열을 반환합니다. 단어는 공백으로 구분됩니다. (Hive 1.1.0부터.)
int levenshtein(string A, string B) 두 문자열 간의 Levenshtein 거리를 반환합니다(Hive 1.2.0부터). 예: levenshtein('kitten', 'sitting')은 3.
string soundex(string A) 문자열의 soundex 코드를 반환합니다(Hive 1.2.0부터). 예: soundex('Miller')는 M460.

데이터 마스킹 함수

다음 내장 데이터 마스킹 함수가 Hive에서 지원됩니다:

반환 타입 이름(시그니처) 설명
string mask(string str[, string upper[, string lower[, string number]]]) str의 마스킹된 버전을 반환합니다(Hive 2.1.0부터). 기본적으로 대문자는 "X", 소문자는 "x", 숫자는 "n"으로. 예: mask("abcd-EFGH-8765-4321")은 xxxx-XXXX-nnnn-nnnn. 추가 인자로 마스크 문자를 재정의할 수 있습니다. 예: mask("abcd-EFGH-8765-4321", "U", "l", "#")은 llll-UUUU-####-####.
string mask_first_n(string str[, int n]) 처음 n개 값이 마스킹된 str의 마스킹 버전을 반환합니다(Hive 2.1.0부터). 예: mask_first_n("1234-5678-8765-4321", 4)은 nnnn-5678-8765-4321.
string mask_last_n(string str[, int n]) 마지막 n개 값이 마스킹된 str의 마스킹 버전을 반환합니다(Hive 2.1.0부터). 예: mask_last_n("1234-5678-8765-4321", 4)은 1234-5678-8765-nnnn.
string mask_show_first_n(string str[, int n]) 처음 n개 문자를 마스킹하지 않고 보여주는 str의 마스킹 버전을 반환합니다(Hive 2.1.0부터). 예: mask_show_first_n("1234-5678-8765-4321", 4)은 1234-nnnn-nnnn-nnnn.
string mask_show_last_n(string str[, int n]) 마지막 n개 문자를 마스킹하지 않고 보여주는 str의 마스킹 버전을 반환합니다(Hive 2.1.0부터). 예: mask_show_last_n("1234-5678-8765-4321", 4)은 nnnn-nnnn-nnnn-4321.
string mask_hash(string|char|varchar str)

기타 함수

반환 타입 이름(시그니처) 설명
varies java_method(class, method[, arg1[, arg2..]]) reflect의 동의어. (Hive 0.9.0부터.)
varies reflect(class, method[, arg1[, arg2..]]) 리플렉션을 사용해 인자 시그니처를 매칭하여 Java 메서드를 호출합니다. (Hive 0.7.0부터.) 예제는 Reflect (Generic) UDF 참고.
int hash(a1[, a2…]) 인자의 해시 값을 반환합니다. (Hive 0.4부터.)
string current_user() 구성된 인증 관리자에서 현재 사용자 이름을 반환합니다(Hive 1.2.0부터). 연결 시 제공한 사용자와 같을 수 있지만 일부 인증 관리자(예: HadoopDefaultAuthenticator)에서는 다를 수 있습니다.
string logged_in_user() 세션 상태에서 현재 사용자 이름을 반환합니다(Hive 2.2.0부터). 이는 Hive에 연결할 때 제공한 사용자 이름입니다.
string current_database() 현재 데이터베이스 이름을 반환합니다(Hive 0.13.0부터).
string md5(string/binary) 문자열 또는 binary에 대한 MD5 128비트 체크섬을 계산합니다(Hive 1.3.0부터). 값은 32자리 16진수 문자열로 반환되며, 인자가 NULL이면 NULL. 예: md5('ABC') = '902fbdd2b1df0c4f70b4a5d23525e932'.
string sha1(string/binary)sha(string/binary) 문자열 또는 binary에 대한 SHA-1 다이제스트를 계산해 16진수 문자열로 반환합니다(Hive 1.3.0부터). 예: sha1('ABC') = '3c01bdbb26f358bab27f267924aa2c9a03fcfdb8'.
bigint crc32(string/binary) 문자열 또는 binary 인자에 대한 순환 중복 검사 값을 계산해 bigint 값을 반환합니다(Hive 1.3.0부터). 예: crc32('ABC') = 2743272264.
string sha2(string/binary, int) SHA-2 계열 해시 함수(SHA-224, SHA-256, SHA-384, SHA-512)를 계산합니다(Hive 1.3.0부터). 두 번째 인자는 원하는 비트 길이로 224, 256, 384, 512 또는 0(256과 동일)이어야 합니다. SHA-224는 Java 8부터 지원. 어느 인자든 NULL이거나 허용 값이 아니면 NULL. 예: sha2('ABC', 256) = 'b5d4045c3f466fa91fe2cc6abe79232a1a57cdf104f7a26e716e0a1e2789df78'.
binary aes_encrypt(input string/binary, key string/binary) AES로 입력을 암호화합니다(Hive 1.3.0부터). 128, 192 또는 256비트 키 길이 사용 가능. 192·256비트 키는 JCE 무제한 강도 정책 파일 설치 시 사용 가능. 어느 인자든 NULL이거나 허용 키 길이가 아니면 NULL. 예: base64(aes_encrypt('ABC', '1234567890123456')) = 'y6Ss+zCYObpCbgfWfyNWTw=='.
binary aes_decrypt(input binary, key string/binary) AES로 입력을 복호화합니다(Hive 1.3.0부터). 예: aes_decrypt(unbase64('y6Ss+zCYObpCbgfWfyNWTw=='), '1234567890123456') = 'ABC'.
string version() Hive 버전을 반환합니다(Hive 2.1.0부터). 문자열은 2개의 필드(빌드 번호와 빌드 해시)를 포함합니다. 예: "select version();"은 "2.1.0.2.5.0.0-1245 r027527b9c5ce1a3d7d0b6d2e6de2378fb0c39232"를 반환할 수 있습니다.
bigint surrogate_key([write_id_bits, task_id_bits]) 테이블에 데이터를 입력할 때 행에 대한 숫자 ID를 자동 생성합니다. acid 또는 insert-only 테이블의 기본값으로만 사용.

xpath

다음 함수는 LanguageManual XPathUDF에서 설명합니다:

  • xpath, xpath_short, xpath_int, xpath_long, xpath_float, xpath_double, xpath_number, xpath_string

get_json_object

제한된 버전의 JSONPath가 지원됩니다:

  • $ : 루트 객체
  • . : 자식 연산자
  • [] : 배열에 대한 아래첨자(subscript) 연산자
  • * : []에 대한 와일드카드

지원되지 않는 구문(눈여겨볼 만한 것):

  • : 길이가 0인 문자열 키
  • .. : 재귀 하강
  • @ : 현재 객체/요소
  • () : 스크립트 표현식
  • ?() : 필터(스크립트) 표현식
  • [,] : 유니언 연산자
  • [start:end.step] : 배열 슬라이스 연산자

예: src_json 테이블은 단일 컬럼(json), 단일 행 테이블입니다:

+----+
                               json
+----+
{"store":
  {"fruit":\[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}],
   "bicycle":{"price":19.95,"color":"red"}
  },
 "email":"amy@only_for_json_udf_test.net",
 "owner":"amy"
}
+----+

json 객체의 필드는 다음 쿼리로 추출할 수 있습니다:

hive> SELECT get_json_object(src_json.json, '$.owner') FROM src_json;
amy

hive> SELECT get_json_object(src_json.json, '$.store.fruit\[0]') FROM src_json;
{"weight":8,"type":"apple"}

hive> SELECT get_json_object(src_json.json, '$.non_exist_key') FROM src_json;
NULL

내장 집계 함수 (UDAF)

다음 내장 집계 함수가 Hive에서 지원됩니다:

반환 타입 이름(시그니처) 설명
BIGINT count(*), count(expr), count(DISTINCT expr[, expr…]) count(*) - NULL 값 포함 검색된 전체 행 수. count(expr) - 제공된 표현식이 non-NULL인 행 수. count(DISTINCT expr[, expr]) - 표현식이 고유하고 non-NULL인 행 수. hive.optimize.distinct.rewrite로 최적화 가능.
DOUBLE sum(col), sum(DISTINCT col) 그룹 내 요소의 합 또는 그룹 내 컬럼의 고유 값 합.
DOUBLE avg(col), avg(DISTINCT col) 그룹 내 요소의 평균 또는 그룹 내 컬럼의 고유 값 평균.
DOUBLE min(col) 그룹 내 컬럼의 최솟값.
DOUBLE max(col) 그룹 내 컬럼의 최댓값.
DOUBLE variance(col), var_pop(col) 그룹 내 숫자 컬럼의 분산.
DOUBLE var_samp(col) 그룹 내 숫자 컬럼의 비편향 표본 분산.
DOUBLE stddev_pop(col) 그룹 내 숫자 컬럼의 표준 편차.
DOUBLE stddev_samp(col) 그룹 내 숫자 컬럼의 비편향 표본 표준 편차.
DOUBLE covar_pop(col1, col2) 그룹 내 숫자 컬럼 쌍의 모집단 공분산.
DOUBLE covar_samp(col1, col2) 그룹 내 숫자 컬럼 쌍의 표본 공분산.
DOUBLE corr(col1, col2) 그룹 내 숫자 컬럼 쌍의 Pearson 상관 계수.
DOUBLE percentile(BIGINT col, p) 그룹 내 컬럼의 정확한 p번째 백분위수(부동소수점 타입에서는 동작 안 함). p는 0과 1 사이. 참고: 실제 백분위수는 정수 값에서만 가능. 입력이 정수가 아니면 PERCENTILE_APPROX 사용.
array percentile(BIGINT col, array(p1 [, p2]…)) 그룹 내 컬럼의 정확한 백분위수 p1, p2, …(부동소수점 타입에서는 동작 안 함).
DOUBLE percentile_approx(DOUBLE col, p [, B]) 그룹 내 숫자 컬럼(부동소수점 포함)의 근사 p번째 백분위수. B 매개변수는 메모리를 희생해 근사 정확도를 제어(기본 10,000). col의 고유 값 수가 B보다 작으면 정확한 백분위수.
array percentile_approx(DOUBLE col, array(p1 [, p2]…) [, B]) 위와 같지만 배열을 받고 반환.
double regr_avgx(independent, dependent) avg(dependent)와 동일. Hive 2.2.0부터.
double regr_avgy(independent, dependent) avg(independent)와 동일. Hive 2.2.0부터.
double regr_count(independent, dependent) 선형 회귀선 피팅에 사용된 non-null 쌍의 수. Hive 2.2.0부터.
double regr_intercept(independent, dependent) 선형 회귀선의 y절편. dependent = a * independent + b에서 b 값. Hive 2.2.0부터.
double regr_r2(independent, dependent) 회귀에 대한 결정 계수. Hive 2.2.0부터.
double regr_slope(independent, dependent) 선형 회귀선의 기울기. dependent = a * independent + b에서 a 값. Hive 2.2.0부터.
double regr_sxx(independent, dependent) regr_count(independent, dependent) * var_pop(dependent)와 동일. Hive 2.2.0부터.
double regr_sxy(independent, dependent) regr_count(independent, dependent) * covar_pop(independent, dependent)와 동일. Hive 2.2.0부터.
double regr_syy(independent, dependent) regr_count(independent, dependent) * var_pop(independent)와 동일. Hive 2.2.0부터.
array<struct {'x','y'}> histogram_numeric(col, b) b개의 균일하지 않은 bin으로 그룹 내 숫자 컬럼의 히스토그램을 계산합니다. 출력은 bin 중심·높이를 나타내는 double 값 (x,y) 좌표의 크기 b 배열.
array collect_set(col) 중복 요소가 제거된 객체 집합을 반환합니다.
array collect_list(col) 중복을 포함한 객체 목록을 반환합니다. (Hive 0.13.0부터.)
INTEGER ntile(INTEGER x) 정렬된 파티션을 x개의 그룹(bucket)으로 나누고 각 행에 버킷 번호를 할당합니다. 삼분위수, 사분위수, 십분위수, 백분위수 등 요약 통계 계산을 쉽게 합니다. (Hive 0.11.0부터.)

내장 테이블 생성 함수 (UDTF)

일반 사용자 정의 함수(예: concat())는 단일 입력 행을 받아 단일 출력 행을 냅니다. 반대로 테이블 생성 함수는 단일 입력 행을 여러 출력 행으로 변환합니다.

행 집합 컬럼 타입 이름(시그니처) 설명
T explode(ARRAY a) 배열을 여러 행으로 확장합니다. 배열의 각 요소마다 한 행씩, 단일 컬럼(col)을 가진 행 집합을 반환합니다.
Tkey,Tvalue explode(MAP<Tkey,Tvalue> m) 맵을 여러 행으로 확장합니다. 각 키-값 쌍마다 한 행씩, 두 컬럼(key,value)을 가진 행 집합을 반환합니다. (Hive 0.8.0부터.)
int,T posexplode(ARRAY a) 추가적인 int 타입 위치 컬럼(원래 배열에서 위치, 0부터 시작)과 함께 배열을 여러 행으로 확장합니다. 두 컬럼(pos,val)을 가진 행 집합을 반환합니다.
T1,…,Tn inline(ARRAY<STRUCTf1:T1,…,fn:Tn> a) 구조체 배열을 여러 행으로 확장합니다. N개의 컬럼(N = struct의 최상위 요소 수)을 가진 행 집합을 반환합니다. (Hive 0.10부터.)
T1,…,Tn/r stack(int r, T1 V1,…, Tn/r Vn) n 개의 값 V1,…,Vn을 r 개의 행으로 나눕니다. 각 행은 n/r 개의 컬럼을 갖습니다. r 은 상수여야 합니다.
string1,…,stringn json_tuple(string jsonStr, string k1,…, string kn) JSON 문자열과 n 개의 키 집합을 받아 n 개의 값 튜플을 반환합니다. get_json_object UDF보다 효율적인 버전입니다. 한 번의 호출로 여러 키를 얻기 때문입니다.
string1,…,stringn parse_url_tuple(string urlStr, string p1,…, string pn) URL 문자열과 n 개의 URL 부분 집합을 받아 n 개의 값 튜플을 반환합니다. parse_url() UDF와 유사하지만 URL에서 여러 부분을 한 번에 추출할 수 있습니다. 유효한 부분 이름: HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE, USERINFO, QUERY:.

사용 예

explode (array)

select explode(array('A','B','C'));
select explode(array('A','B','C')) as col;
select tf.* from (select 0) t lateral view explode(array('A','B','C')) tf;
select tf.* from (select 0) t lateral view explode(array('A','B','C')) tf as col;

explode (map)

select explode(map('A',10,'B',20,'C',30));
select explode(map('A',10,'B',20,'C',30)) as (key,value);
select tf.* from (select 0) t lateral view explode(map('A',10,'B',20,'C',30)) tf;
select tf.* from (select 0) t lateral view explode(map('A',10,'B',20,'C',30)) tf as key,value;

posexplode (array)

select posexplode(array('A','B','C'));
select posexplode(array('A','B','C')) as (pos,val);
select tf.* from (select 0) t lateral view posexplode(array('A','B','C')) tf;
select tf.* from (select 0) t lateral view posexplode(array('A','B','C')) tf as pos,val;

inline (구조체 배열)

select inline(array(struct('A',10,date '2015-01-01'),struct('B',20,date '2016-02-02')));
select inline(array(struct('A',10,date '2015-01-01'),struct('B',20,date '2016-02-02'))) as (col1,col2,col3);
select tf.* from (select 0) t lateral view inline(array(struct('A',10,date '2015-01-01'),struct('B',20,date '2016-02-02'))) tf;
select tf.* from (select 0) t lateral view inline(array(struct('A',10,date '2015-01-01'),struct('B',20,date '2016-02-02'))) tf as col1,col2,col3;

stack (값)

select stack(2,'A',10,date '2015-01-01','B',20,date '2016-01-01');
select stack(2,'A',10,date '2015-01-01','B',20,date '2016-01-01') as (col0,col1,col2);
select tf.* from (select 0) t lateral view stack(2,'A',10,date '2015-01-01','B',20,date '2016-01-01') tf;
select tf.* from (select 0) t lateral view stack(2,'A',10,date '2015-01-01','B',20,date '2016-01-01') tf as col0,col1,col2;

"SELECT udtf(col) AS colAlias…" 구문은 몇 가지 제한이 있습니다:

  • SELECT에 다른 표현식은 허용되지 않습니다.
    • SELECT pageid, explode(adid_list) AS myCol… 는 지원되지 않습니다.
  • UDTF는 중첩할 수 없습니다.
    • SELECT explode(explode(adid_list)) AS myCol… 는 지원되지 않습니다.
  • GROUP BY / CLUSTER BY / DISTRIBUTE BY / SORT BY는 지원되지 않습니다.
    • SELECT explode(adid_list) AS myCol … GROUP BY myCol은 지원되지 않습니다.

이런 제한이 없는 대체 구문은 LanguageManual LateralView를 참고하세요.

커스텀 UDTF를 만들고 싶다면 Writing UDTFs도 참고하세요.

explode

explode()는 배열(또는 맵)을 입력으로 받아 배열(맵)의 요소를 별도의 행으로 출력합니다. UDTF는 SELECT 표현식 목록에서 그리고 LATERAL VIEW의 일부로 사용할 수 있습니다.

SELECT 표현식 목록에서 explode()를 사용하는 예로, myTable이라는 단일 컬럼(myCol)과 두 행을 가진 테이블을 고려해 봅시다:

Array myCol
[100,200,300]
[400,500,600]

그런 다음 다음 쿼리를 실행하면:

SELECT explode(myCol) AS myNewCol FROM myTable;

다음을 생성합니다:

(int) myNewCol
100
200
300
400
500
600

Map과의 사용도 유사합니다:

SELECT explode(myMap) AS (myMapKey, myMapValue) FROM myMapTable;

posexplode

Hive 0.13.0부터 사용 가능합니다(HIVE-4943 참고).

posexplode()explode와 유사하지만 배열의 요소만 반환하는 대신 요소와 함께 원래 배열에서의 위치도 반환합니다.

SELECT posexplode(myCol) AS pos, myNewCol FROM myTable;

다음을 생성합니다:

(int) pos (int) myNewCol
1 100
2 200
3 300
1 400
2 500
3 600

json_tuple

새로운 json_tuple() UDTF가 Hive 0.7에서 도입되었습니다. 이름(키) 집합과 JSON 문자열을 받아 하나의 함수로 값 튜플을 반환합니다. 이는 단일 JSON 문자열에서 하나 이상의 키를 검색하기 위해 GET_JSON_OBJECT를 여러 번 호출하는 것보다 훨씬 효율적입니다. 단일 JSON 문자열을 두 번 이상 파싱해야 하는 경우, 한 번 파싱하면 쿼리가 더 효율적이며 이것이 JSON_TUPLE의 목적입니다. JSON_TUPLE은 UDTF이므로 같은 목표를 달성하려면 LATERAL VIEW 구문을 사용해야 합니다.

예를 들어,

select a.timestamp, get_json_object(a.appevents, '$.eventid'), get_json_object(a.appenvets, '$.eventname') from log a;

다음으로 바꿔야 합니다:

select a.timestamp, b.*
from log a lateral view json_tuple(a.appevent, 'eventid', 'eventname') b as f1, f2;

parse_url_tuple

parse_url_tuple() UDTF는 parse_url()과 유사하지만 주어진 URL의 여러 부분을 추출해 튜플로 반환할 수 있습니다. QUERY에서 특정 키의 값을 추출하려면 partToExtract 인자에 콜론과 키를 붙이면 됩니다. 예: parse_url_tuple('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'QUERY:k1', 'QUERY:k2')는 'v1','v2' 값의 튜플을 반환합니다. 이는 parse_url()을 여러 번 호출하는 것보다 효율적입니다. 모든 입력 매개변수와 출력 컬럼 타입은 string입니다.

SELECT b.*
FROM src LATERAL VIEW parse_url_tuple(fullurl, 'HOST', 'PATH', 'QUERY', 'QUERY:id') b as host, path, query, query_id LIMIT 1;

f(column)에 대한 GROUPing과 SORTing

일반적인 OLAP 패턴은 타임스탬프 컬럼이 있고 초 단위보다는 일별 또는 다른 덜 세밀한 날짜 창으로 그룹화하려는 경우입니다. 그래서 concat(year(dt),month(dt))를 선택한 다음 그 concat()에 대해 그룹화하고 싶을 수 있습니다. 그러나 함수를 적용하고 별칭을 붙인 컬럼에 대해 GROUP BY 또는 SORT BY를 시도하면:

select f(col) as fc, count(*) from table_name group by fc;

다음 오류가 발생합니다:

FAILED: Error in semantic analysis: line 1:69 Invalid Table Alias or Column Reference fc

함수가 적용된 컬럼 별칭에 대해 GROUP BY나 SORT BY를 할 수 없기 때문입니다. 두 가지 해결 방법이 있습니다. 첫째, 서브쿼리로 쿼리를 재구성할 수 있습니다(다소 복잡):

select sq.fc,col1,col2,...,colN,count(*) from
  (select f(col) as fc,col1,col2,...,colN from table_name) sq
 group by sq.fc,col1,col2,...,colN;

또는 컬럼 별칭을 사용하지 않도록 하는 것인데 더 간단합니다:

select f(col) as fc, count(*) from table_name group by f(col);

유틸리티 함수

함수 이름 반환 타입 설명 실행
version String Hive 버전 세부 정보를 제공합니다(패키지 빌드 버전). select version();
buildversion String checksum을 포함하는 Version 함수의 확장. select buildversion();

UDF 내부 동작

UDF의 evaluate 메서드 컨텍스트는 한 번에 한 행입니다. 다음과 같은 UDF의 간단한 호출은:

SELECT length(string_col) FROM table_name;

작업의 map 부분에서 each string_col 값의 length를 평가합니다. UDF가 map 쪽에서 평가되는 부작용은 mapper로 보내지는 행의 순서를 제어할 수 없다는 것입니다. mapper로 보내지는 파일 스플릿이 역직렬화되는 순서와 같습니다. SORT BY, ORDER BY, 일반 JOIN 같은 reduce 쪽 연산은 UDF 출력에 테이블의 또 다른 컬럼처럼 적용됩니다. UDF의 evaluate 메서드 컨텍스트가 한 번에 한 행을 의도했으므로 이는 문제가 없습니다.

같은 UDF로 보내지는 행을 제어하고 싶다면 reduce 단계에서 UDF가 평가되도록 하고 싶을 것입니다. 이는 DISTRIBUTE BY, DISTRIBUTE BY + SORT BY, CLUSTER BY를 사용해 달성할 수 있습니다. 예제 쿼리는:

SELECT reducer_udf(my_col, distribute_col, sort_col) FROM
(SELECT my_col, distribute_col, sort_col FROM table_name DISTRIBUTE BY distribute_col SORT BY distribute_col, sort_col) t

그러나 같은 UDF로 보내지는 행 집합을 제어할 필요의 전제가 그 UDF에서 집계를 하기 위한 것이라고 주장할 수도 있습니다. 그런 경우 사용자 정의 집계 함수(UDAF)를 사용하는 것이 더 나은 선택입니다. UDAF 작성에 대해 더 읽으려면 여기를 참고하세요. 또는 Hive의 Transform 기능을 사용해 커스텀 reduce 스크립트로 같은 것을 달성할 수 있습니다. 두 옵션 모두 reduce 쪽에서 집계를 수행합니다.

커스텀 UDF 만들기

커스텀 UDF를 만드는 방법에 대한 정보는 Hive Plugins와 Create Function을 참고하세요.

더 알아보기 (Learn more)

UDTF를 SELECT 목록 밖에서 풀려면 Lateral View 문서를, 직접 UDAF를 작성하려면 GenericUDAF 튜토리얼을 참고해요.