Hive 데이터 타입

Hive 데이터 타입 (LanguageManual Data Types)

이 문서는 Hive에서 지원하는 모든 데이터 타입을 나열해요. 숫자(number)·날짜/시간·문자열·기타·복합(complex) 타입으로 나뉘며, 각 타입별 세부 동작과 리터럴, 허용되는 암시적 변환 규칙까지 다루므로 테이블 스키마를 설계할 때 정확한 타입을 고르는 데 도움이 된답니다.

출처: 문서

본문

개요 (Overview)

이 문서는 Hive에서 지원되는 모든 데이터 타입을 나열해요. 추가 정보는 TutorialType System을 참고해요.

HCatalog가 지원하는 데이터 타입은 다음을 참고해요:

숫자 타입 (Numeric Types)

  • TINYINT (1바이트 부호 있는 정수, -128부터 127까지)
  • SMALLINT (2바이트 부호 있는 정수, -32,768부터 32,767까지)
  • INT/INTEGER (4바이트 부호 있는 정수, -2,147,483,648부터 2,147,483,647까지)
  • BIGINT (8바이트 부호 있는 정수, -9,223,372,036,854,775,808부터 9,223,372,036,854,775,807까지)
  • FLOAT (4바이트 단정밀도 부동소수점 숫자)
  • DOUBLE (8바이트 배정밀도 부동소수점 숫자)
  • DOUBLE PRECISION (DOUBLE의 별칭, Hive 2.2.0부터만 사용 가능)
  • DECIMAL
    • 38자리 정밀도로 Hive 0.11.0에서 도입
    • Hive 0.13.0에서 사용자 정의 precision/scale 도입
  • NUMERIC (DECIMAL과 동일, Hive 3.0.0부터)

날짜/시간 타입 (Date/Time Types)

문자열 타입 (String Types)

기타 타입 (Misc Types)

  • BOOLEAN
  • BINARY (주: Hive 0.8.0부터만 사용 가능)

복합 타입 (Complex Types)

  • arrays: ARRAY<data_type> (주: Hive 0.14부터 음수 값과 비상수 표현식 허용.)
  • maps: MAP<primitive_type, data_type> (주: Hive 0.14부터 음수 값과 비상수 표현식 허용.)
  • structs: STRUCT<col_name : data_type [COMMENT col_comment], ...>
  • union: UNIONTYPE<data_type, data_type, ...> (주: Hive 0.7.0부터만 사용 가능)

컬럼 타입 (Column Types)

정수 타입 (TINYINT, SMALLINT, INT/INTEGER, BIGINT)

정수 리터럴은 기본적으로 INT로 가정되며, 숫자가 INT 범위를 초과해 BIGINT로 해석되거나, 숫자에 다음 접미사 중 하나가 있지 않으면 그렇게 돼요.

타입 접미사
TINYINT Y 100Y
SMALLINT S 100S
BIGINT L 100L

버전 (Version)

INTEGER는 Hive 2.2.0에서 INT의 동의어로 도입됐어요 (HIVE-14950).

문자열 (Strings)

문자열 리터럴은 단일 따옴표(') 또는 이중 따옴표(")로 표현할 수 있어요. Hive는 문자열 안에서 C 스타일 이스케이프를 사용해요.

Varchar

Varchar 타입은 문자 문자열에 허용되는 최대 문자 수를 정의하는 길이 지정자(1에서 65535 사이)로 생성돼요. varchar 값으로 변환/할당되는 문자열 값이 길이 지정자를 초과하면 문자열은 조용히 잘려요(truncated). 문자 길이는 문자 문자열이 포함하는 코드 포인트 수로 결정돼요.

string과 마찬가지로 varchar에서는 후행 공백이 중요하며 비교 결과에 영향을 줘요.

제약 사항 (Limitations)

제네릭이 아닌 UDF는 varchar 타입을 입력 인자나 반환값으로 직접 사용할 수 없어요. 대신 String UDF를 만들 수 있고, varchar 값은 문자열로 변환돼 UDF에 전달돼요. varchar 인자를 직접 사용하거나 varchar 값을 반환하려면 GenericUDF를 만들어요. 반사(reflection) 기반 메서드로 타입 정보를 검색하는 경우 varchar를 지원하지 않는 다른 컨텍스트가 있을 수 있어요. 일부 SerDe 구현이 포함돼요.

버전 (Version)

Varchar 데이터 타입은 Hive 0.12.0에서 도입됐어요 (HIVE-4844).

Char

Char 타입은 Varchar와 비슷하지만 고정 길이로, 지정된 길이 값보다 짧은 값은 공백으로 채워지지만 비교 중 후행 공백은 중요하지 않아요. 최대 길이는 255로 고정돼요.

CREATE TABLE foo (bar CHAR(10))

버전 (Version)

Char 데이터 타입은 Hive 0.13.0에서 도입됐어요 (HIVE-5191).

Timestamps

선택적 나노초 정밀도를 가진 전통적인 UNIX 타임스탬프를 지원해요.

지원되는 변환:

  • 정수 숫자 타입: 초 단위 UNIX 타임스탬프로 해석
  • 부동소수점 숫자 타입: 소수 정밀도를 가진 초 단위 UNIX 타임스탬프로 해석
  • 문자열: JDBC 호환 java.sql.Timestamp 형식 "YYYY-MM-DD HH:MM:SS.fffffffff" (9자리 소수 정밀도)

타임스탬프는 시간대가 없는 것으로 해석되고 UNIX epoch로부터의 오프셋으로 저장돼요. 시간대와의 변환을 위한 편의 UDF가 제공돼요 (to_utc_timestamp, from_utc_timestamp). 모든 기존 날짜/시간 UDF(month, day, year, hour 등)는 TIMESTAMP 데이터 타입과 함께 동작해요.

텍스트 파일의 타임스탬프는 yyyy-mm-dd hh:mm:ss[.f...] 형식을 사용해야 해요. 다른 형식이라면 적절한 타입(INT, FLOAT, STRING 등)으로 선언하고 UDF로 타임스탬프로 변환해요.

Parquet 파일의 타임스탬프는 hive.parquet.write.int64.timestamp=truehive.parquet.timestamp.time.unit을 기본 저장 시간 단위로 설정해 int96(대신) int64로 저장될 수 있어요. ("nanos", "micros", "millis"; 기본: "micros"). 64비트만 저장되므로 "nanos"로 저장된 int64 타임스탬프는 1677-09-21T00:12:43.15와 2262-04-11T23:47:16.8 범위 밖이면 NULL로 저장된다는 점에 유의해요.

테이블 수준에서 SerDe 속성 "timestamp.formats"에 형식을 제공해 대체 타임스탬프 형식을 지원할 수 있어요 (릴리스 1.2.0부터 HIVE-9298). 예를 들어 yyyy-MM-dd'T'HH:mm:ss.SSS,yyyy-MM-dd'T'HH:mm:ss..

버전 (Version)

Timestamps는 Hive 0.8.0에서 도입됐어요 (HIVE-2272).

날짜 (Dates)

DATE 값은 YYYY-MM-DD 형태로 특정 연/월/일을 기술해요. 예: DATE '2013-01-01'. Date 타입은 하루 중 시간 요소가 없어요. Date 타입에 지원되는 값 범위는 0000-01-01부터 9999-12-31까지이며, 기본 Java Date 타입의 지원에 의존해요.

버전 (Version)

Dates는 Hive 0.12.0에서 도입됐어요 (HIVE-4055).

날짜 캐스팅 (Casting Dates)

Date 타입은 Date, Timestamp 또는 String 타입으로만/로부터 변환될 수 있어요. 사용자 지정 형식으로의 캐스팅은 여기에 문서화되어 있어요.

Date 타입으로/로부터 유효한 캐스트 결과
cast(date as date) 같은 날짜 값
cast(timestamp as date) 로컬 시간대를 기준으로 타임스탬프의 연/월/일이 결정되고 날짜 값으로 반환됨
cast(string as date) 문자열이 'YYYY-MM-DD' 형태이면 해당 연/월/일에 대응하는 날짜 값 반환. 형식과 일치하지 않으면 NULL 반환
cast(date as timestamp) 로컬 시간대를 기준으로 날짜 값의 연/월/일 자정에 대응하는 타임스탬프 값 생성
cast(date as string) Date가 나타내는 연/월/일이 'YYYY-MM-DD' 형태의 문자열로 포맷됨

구간 (Intervals)

지원되는 구간 설명 의미 이후 버전
시간 단위 구간: SECOND / MINUTE / DAY / MONTH / YEAR INTERVAL '1' DAY 1일(days)의 구간 Hive 1.2.0 (HIVE-9792)
년-월 구간, 형식: SY-MS (S: 선택 부호(+/-) / Y: 년 수 / M: 월 수) INTERVAL '1-2' YEAR TO MONTH INTERVAL '1' YEAR + INTERVAL '2' MONTH의 축약 Hive 1.2.0 (HIVE-9792)
일-초 구간, 형식: SD H:M:S.nnnnnn (S: 선택 부호 / D: 일 수 / H: 시간 / M: 분 / S: 초 / nnnnnn: 선택 나노시간) INTERVAL '1 2:3:4.000005' DAY INTERVAL '1' DAY + INTERVAL '2' HOUR + INTERVAL '3' MINUTE + INTERVAL '4' SECOND + INTERVAL '5' NANO의 축약 Hive 1.2.0 (HIVE-9792)
상수 숫자 구간 지원 INTERVAL 1 DAY 쿼리 가독성/이식성 도움 Hive 2.2.0 (HIVE-13557)
표현식 구간 지원: 다른 함수/컬럼을 포함할 수 있음. 표현식은 숫자(부동소수점 아님) 또는 문자열을 반환해야 함 INTERVAL (1+dt) DAY 동적 구간 가능하게 함 Hive 2.2.0 (HIVE-13557)
interval 키워드 선택 사용: 표현식 구간(예: INTERVAL (1+dt) SECOND)에는 INTERVAL 키워드 사용이 필수 1 DAY, '1-2' YEAR TO MONTH INTERVAL 1 DAY, INTERVAL '1-2' YEARS TO MONTH Hive 2.2.0 (HIVE-13557)
이식성/가독성을 위한 시간 단위 별칭 추가: SECONDS / MINUTES / HOURS / DAYS / WEEKS / MONTHS / YEARS 2 SECONDS 2 SECOND Hive 2.2.0 (HIVE-13557)

Decimals

버전 (Version)

Decimal 데이터 타입은 Hive 0.11.0 (HIVE-2693)에서 도입되고 Hive 0.13.0 (HIVE-3976)에서 수정됐어요.

NUMERIC은 Hive 3.0.0 (HIVE-16764)부터 DECIMAL과 같아요.

Hive의 DECIMAL 타입은 Java에서 불변 임의 정밀도 십진수를 나타내는 데 사용되는 Java의 BigDecimal을 기반으로 해요. 모든 일반 숫자 연산(예: +, -, *, /)과 관련 UDF(예: Floor, Ceil, Round 등)가 decimal 타입을 처리해요. 다른 숫자 타입처럼 decimal 타입으로/로부터 캐스트할 수 있어요. decimal 타입의 영속 형식은 과학 표기법과 비과학 표기법을 모두 지원해요. 따라서 데이터셋에 4.004E+3(과학 표기법) 또는 4004(비과학 표기법) 또는 둘의 조합 같은 데이터가 있더라도 DECIMAL을 사용할 수 있어요.

  • Hive 0.11과 0.12는 DECIMAL 타입의 정밀도가 38자리로 고정되고 제한돼요.
  • Hive 0.13부터 사용자는 DECIMAL(precision, scale) 문법으로 DECIMAL 데이터 타입으로 테이블을 만들 때 scale과 precision을 지정할 수 있어요. scale을 지정하지 않으면 기본값 0(소수 자릿수 없음)이에요. precision을 지정하지 않으면 기본값 10이에요.
CREATE TABLE foo (
  a DECIMAL, -- 기본값 decimal(10,0)
  b DECIMAL(9, 7)
)

사용법은 아래의 Literals 섹션의 Floating Point Types를 참고해요.

Decimal 리터럴

BIGINT보다 큰 정수 리터럴은 Decimal(38,0)으로 처리해야 해요. 접미사 BD가 필요해요. 예:

select CAST(18446744073709001000BD AS DECIMAL(38,0)) from my_table limit 1;

Hive 0.12.0과 0.13.0 사이의 Decimal 타입 비호환성

Hive 0.13.0의 Decimal 데이터 타입 변경으로, Hive 0.13.0 이전의 컬럼(타입 "decimal")은 decimal(10,0) 타입으로 취급돼요. 이는 이 테이블에서 읽히는 기존 데이터가 10자리 정수 값으로 취급되고, 이 테이블에 쓰이는 데이터는 쓰기 전에 10자리 정수 값으로 변환된다는 뜻이에요. 이런 문제를 피하려면 Decimal 컬럼이 있는 테이블을 가진 Hive 0.12 이하 사용자는 Hive 0.13.0 이상으로 업그레이드한 후 테이블을 마이그레이션해야 해요.

Hive 0.13.0 이전 Decimal 컬럼 업그레이드

사용자가 Hive 0.12.0 이하이고 decimal 컬럼으로 테이블을 만들었다면, Hive 0.13.0 이상으로 업그레이드한 이 테이블들에 다음 단계를 수행해야 해요.

  1. 테이블의 decimal 컬럼에 설정할 precision/scale을 결정해요.
  2. 테이블의 각 decimal 컬럼에 대해 ALTER TABLE 명령으로 컬럼 정의를 원하는 precision/scale로 갱신해요:
ALTER TABLE foo CHANGE COLUMN dec_column_name dec_column_name DECIMAL(38,18);

테이블이 파티션되지 않았다면 끝났어요. 테이블에 파티션이 있으면 3단계로 진행해요. 3. 테이블이 파티션된 테이블이면 테이블의 파티션 목록을 찾아요:

SHOW PARTITIONS foo;
 
ds=2008-04-08/hr=11
ds=2008-04-08/hr=12
...
  1. 테이블의 각 기존 파티션도 DECIMAL 컬럼을 원하는 precision/scale로 변경해야 해요.

이는 동적 파티셔닝을 사용하는 단일 ALTER TABLE CHANGE COLUMN으로 할 수 있어요 (동적 파티셔닝은 HIVE-8411로 Hive 0.14 이상에서 ALTER TABLE CHANGE COLUMN에 사용 가능):

SET hive.exec.dynamic.partition = true;
 
-- ALTER PARTITION과 동적 파티셔닝을 활성화하려면 hive.exec.dynamic.partition을 true로 설정해야 함
-- 이는 테이블의 모든 기존 파티션을 변경함 - 무엇을 하고 있는지 확실히 하세요!
ALTER TABLE foo PARTITION (ds, hr) CHANGE COLUMN dec_column_name dec_column_name DECIMAL(38,18);

대안으로, 문당 하나의 파티션을 지정해 ALTER TABLE CHANGE COLUMN으로 한 번에 하나씩 할 수 있어요 (Hive 0.14 이상에서 HIVE-7971로 사용 가능):

ALTER TABLE foo PARTITION (ds='2008-04-08', hr=11) CHANGE COLUMN dec_column_name dec_column_name DECIMAL(38,18);
ALTER TABLE foo PARTITION (ds='2008-04-08', hr=12) CHANGE COLUMN dec_column_name dec_column_name DECIMAL(38,18);
...

Decimal 데이터 타입은 아래 Floating Point Types에서 더 논의돼요.

Union 타입

UNIONTYPE 지원은 불완전 (UNIONTYPE support is incomplete)

UNIONTYPE 데이터 타입은 Hive 0.7.0 (HIVE-537)에서 도입됐지만, 이 타입에 대한 Hive의 완전한 지원은 여전히 불완전해요. JOIN (HIVE-2508), WHERE, GROUP BY 절에서 UNIONTYPE 필드를 참조하는 쿼리는 실패하며, Hive는 UNIONTYPE의 tag나 value 필드를 추출하는 문법을 정의하지 않아요. 즉 UNIONTYPE은 사실상 pass-through 전용이에요.

Union 타입은 어느 한 시점에 지정된 데이터 타입 중 정확히 하나만 보유할 수 있어요. create_union UDF로 이 타입의 인스턴스를 만들 수 있어요:

CREATE TABLE union_test(foo UNIONTYPE<int, double, array<string>, struct<a:int,b:string>>);
SELECT foo FROM union_test;

{0:1}
{1:2.0}
{2:["three","four"]}
{3:{"a":5,"b":"five"}}
{2:["six","seven"]}
{3:{"a":8,"b":"eight"}}
{0:9}
{1:10.0}

역직렬화된 union의 첫 부분은 tag로, union의 어느 부분이 사용 중인지 알려줘요. 이 예에서 0은 정의의 첫 번째 data_type인 int를 의미하는 식이에요.

union을 만들려면 이 tag를 create_union UDF에 제공해야 해요:

SELECT create_union(0, key), create_union(if(key<100, 0, 1), 2.0, value), create_union(1, "a", struct(2, "b")) FROM src LIMIT 2;

{0:"238"}	{1:"val_238"}	{1:{"col1":2,"col2":"b"}}
{0:"86"}	{0:2.0}	{1:{"col1":2,"col2":"b"}}

리터럴 (Literals)

부동소수점 타입 (Floating Point Types)

부동소수점 리터럴은 DOUBLE로 가정돼요. 과학 표기법은 아직 지원되지 않아요.

Decimal 타입

버전 (Version)

Decimal 데이터 타입은 Hive 0.11.0 (HIVE-2693)에서 도입됐어요. 위 Decimal Datatype 참고.

NUMERIC은 Hive 3.0.0 (HIVE-16764)부터 DECIMAL과 같아요.

Decimal 리터럴은 DOUBLE 타입보다 부동소수점 숫자에 정확한 값과 더 큰 범위를 제공해요. Decimal 데이터 타입은 숫자 값의 정확한 표현을 저장하는 반면, DOUBLE 데이터 타입은 숫자 값의 매우 가까운 근사치를 저장해요.

Decimal 타입은 DOUBLE의 (매우 가까운) 근사치가 불충분한 사용 사례(금융 애플리케이션, 동등/비동등 검사, 반올림 연산)에 필요해요. 또한 DOUBLE 범위(대략 -10^308부터 10^308까지) 밖이거나 0에 매우 가까운 숫자(-10^-308부터 10^-308까지)를 다루는 사용 사례에도 필요해요. DOUBLE 타입의 한계에 대한 일반적 논의는 Wikipedia 문서 Double-precision floating-point format을 참고해요.

Hive에서 Decimal 타입의 정밀도는 38자리로 제한돼요. 이 한도를 선택한 이유에 대한 의견은 HIVE-4271HIVE-4320을 참고해요.

Decimal 타입 사용

다음 문법으로 Decimal 타입을 사용하는 Hive 테이블을 만들 수 있어요:

create table decimal_1 (t decimal);

decimal_1 테이블은 기본적으로 Decimal 값인 decimal 타입의 필드 하나를 가진 테이블이에요.

LazySimpleSerDe 또는 LazyBinarySerDe를 사용해 그러한 테이블의 값을 읽고 쓸 수 있어요. 예:

alter table decimal_1 set serde 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe';

또는:

alter table decimal_1 set serde 'org.apache.hadoop.hive.serde2.lazy.LazyBinarySerDe';

캐스트를 사용해 Decimal 값을 BOOLEAN 같은 다른 원시 타입으로 변환할 수 있어요. 예:

select cast(t as boolean) from decimal_2;
수학 UDF

Decimal은 또한 DOUBLE의 경우와 같은 문법으로 많은 산술 연산자, 수학 UDF, UDAF를 지원해요.

decimal 타입을 사용할 수 있는 기본 수학 연산:

다음 반올림 함수들도 decimal 타입을 받을 수 있어요:

  • Floor
  • Ceiling
  • Round

Power(decimal, n)는 지수 n에 대해 양의 정수 값만 지원해요.

Decimal 값 캐스팅

decimal 값과 integer, double, boolean 등 다른 원시 타입 사이의 캐스팅이 지원돼요.

Decimal 타입 테스트

TestCliDriver 프레임워크의 일부로 두 개의 새 테스트가 추가됐어요. 그것은 decimal_1.q와 decimal_2.q예요. udf7.q 같은 다른 테스트는 위에서 언급한 UDF들의 전 범위를 다뤄요.

실패나 특정 타입 캐스트(예: date로 캐스팅)가 방지되는 경우를 보여주는 더 많은 테스트가 추가되어야 해요. Decimal의 반올림이 SQL 표준과 정확히 동일하게 동작하지 않아 round 함수에 약간의 모호함이 있고, 따라서 현재 작업에서는 생략됐어요.

Hive 테스트 실행에 대한 일반 정보는 How to Contribute to Apache HiveHive Developer FAQ를 참고해요.

NULL 값 처리 (Handling of NULL Values)

누락된 값은 특수 값 NULL로 표현돼요. NULL 필드가 있는 데이터를 가져오려면 테이블이 사용하는 SerDe의 문서를 확인해요. (기본 Text Format은 가져올 때 문자열 \N을 NULL로 해석하는 LazySimpleSerDe를 사용해요.)

타입 변경 (Change Types)

hive.metastore.disallow.incompatible.col.type.changes가 false로 설정되면 Metastore의 컬럼 타입을 아무 타입에서 다른 타입으로 변경할 수 있어요. 이러한 타입 변경 후 데이터가 새 타입으로 올바르게 표시될 수 있으면 데이터가 표시되고, 그렇지 않으면 데이터가 NULL로 표시돼요.

허용되는 암시적 변환 (Allowed Implicit Conversions)

void boolean tinyint smallint int bigint float double decimal string varchar timestamp date binary
void에서 true true true true true true true true true true true true true true
boolean에서 false true false false false false false false false false false false false false
tinyint에서 false false true true true true true true true true true false false false
smallint에서 false false false true true true true true true true true false false false
int에서 false false false false true true true true true true true false false false
bigint에서 false false false false false true true true true true true false false false
float에서 false false false false false false true true true true true false false false
double에서 false false false false false false false true true true true false false false
decimal에서 false false false false false false false false true true true false false false
string에서 false false false false false false false true true true true false false false
varchar에서 false false false false false false false true true true true false false false
timestamp에서 false false false false false false false false false true true true false false
date에서 false false false false false false false false false true true false true false
binary에서 false false false false false false false false false false false false false true

더 알아보기 (Learn more)