列のデータ型を変更する
既存のタイプでは必要な量の情報を保持できなくなった場合は、別の列タイプを使用することをお勧めします。例えば、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
という新しいテーブルを作成します。新しいテーブルでは、`o_shippriority`
列のデータ型として INT
の代わりに BIGINT
が使用されます。
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;