열 데이터 형식 변경
기존 유형에 필요한 양의 정보를 더 이상 보관할 수 없는 경우 다른 열 유형을 사용하는 것이 좋습니다. 예를 들어 ID 열의 값은 INT
데이터 형식의 크기를 초과할 수 있으므로 BIGINT
데이터 형식을 사용해야 합니다.
고려 사항
열에 대해 다른 데이터 형식을 사용하려는 경우 다음 사항을 고려해야 합니다.
-
대부분의 경우 열의 데이터 형식을 직접 변경할 수는 없습니다. 대신 Athena 테이블을 다시 생성하고 새 데이터 형식으로 열을 정의합니다.
-
특정 데이터 형식만 다른 데이터 형식으로 읽을 수 있습니다. 처리할 수 있는 데이터 형식은 본 섹션의 테이블을 참조하세요.
-
Parquet 및 ORC의 데이터인 경우 테이블이 파티셔닝되지 않으면 열에 대해 다른 데이터 형식을 사용할 수 없습니다.
-
Parquet 및 ORC 형식의 분할된 테이블의 경우 파티션의 열 형식은 다른 파티션의 열 형식과 다를 수 있으며, Athena는 가능하다면 원하는 형식으로
CAST
합니다. 자세한 내용은 파티션이 있는 테이블의 스키마 불일치 오류 방지을 참조하세요. -
LazySimpleSerDe를 사용하여 생성한 테이블의 경우에만
ALTER TABLE REPLACE COLUMNS
문을 사용하여 기존 열을 다른 데이터 형식으로 바꿀 수 있지만 유지하려는 기존 열도 모두 해당 명령문에서 다시 정의해야 합니다. 그렇지 않으면 해당 열이 삭제됩니다. 자세한 내용은 ALTER TABLE REPLACE COLUMNS 단원을 참조하십시오. -
Apache Iceberg 테이블의 경우에만 ALTER TABLE CHANGE COLUMN 문을 사용하여 열의 데이터 형식을 변경할 수 있습니다.
ALTER TABLE REPLACE COLUMNS
는 Iceberg 테이블에서 지원되지 않습니다. 자세한 내용은 Iceberg 테이블 스키마 개선 단원을 참조하십시오.
중요
데이터 형식 변환을 수행하기 전에 쿼리를 테스트 및 확인하는 것이 좋습니다. Athena에서 대상 데이터 형식을 사용할 수 없는 경우 CREATE TABLE
쿼리에 실패할 수 있습니다.
호환되는 데이터 형식 사용
가능하면 호환되는 데이터 형식을 사용하세요. 다음 표에는 다른 데이터 형식으로 처리될 수 있는 데이터 형식이 나열되어 있습니다.
원래 데이터 형식 | 사용 가능한 대상 데이터 형식 |
---|---|
STRING |
BYTE , TINYINT , SMALLINT ,
INT , BIGINT |
BYTE |
TINYINT , SMALLINT , INT ,
BIGINT |
TINYINT |
SMALLINT , INT ,
BIGINT |
SMALLINT |
INT , BIGINT |
INT |
BIGINT |
FLOAT |
DOUBLE |
다음 예제에서는 원래 orders_json
테이블에 대해 CREATE TABLE
문을 사용하여 orders_json_bigint
라는 새 테이블을 생성합니다. 새 테이블은 INT
대신 BIGINT
를 `o_shippriority`
열의 데이터 형식으로 사용합니다.
CREATE EXTERNAL TABLE orders_json_bigint ( `o_orderkey` int, `o_custkey` int, `o_orderstatus` string, `o_totalprice` double, `o_orderdate` string, `o_orderpriority` string, `o_clerk` string, `o_shippriority` BIGINT ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' LOCATION 's3://amzn-s3-demo-bucket/orders_json';
데이터 형식이 변경되기 전에 원래 SELECT
쿼리와 비슷한 다음 쿼리가 실행됩니다:
Select * from orders_json LIMIT 10;