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 Types의 Mathematical 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를 포함하면 TRUE를 반환합니다. |
| array |
sort_array(Array |
배열 요소의 자연 순서에 따라 입력 배열을 오름차순으로 정렬해 반환합니다(버전 0.9.0부터). |
타입 변환 함수
다음 타입 변환 함수가 Hive에서 지원됩니다:
| 반환 타입 | 이름(시그니처) | 설명 |
|---|---|---|
| binary | binary(string|binary) | |
| 타입 | cast(expr as |
표현식 expr의 결과를 |
날짜 함수
다음 내장 날짜 함수가 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 |
"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 |
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 |
배열을 여러 행으로 확장합니다. 배열의 각 요소마다 한 행씩, 단일 컬럼(col)을 가진 행 집합을 반환합니다. |
| Tkey,Tvalue | explode(MAP<Tkey,Tvalue> m) | 맵을 여러 행으로 확장합니다. 각 키-값 쌍마다 한 행씩, 두 컬럼(key,value)을 가진 행 집합을 반환합니다. (Hive 0.8.0부터.) |
| int,T | posexplode(ARRAY |
추가적인 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 |
|---|
| [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 튜토리얼을 참고해요.