列のデータ型を変更する - Amazon Athena

列のデータ型を変更する

既存のタイプでは必要な量の情報を保持できなくなった場合は、別の列タイプを使用することをお勧めします。例えば、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;