Amazon Athena
ユーザーガイド

更新型

これは、テーブルのスキーマが使用できる更新の型です。スキーマの各型を確認し、Athena で実行することができるデータ形式を指定します。

重要

このセクションで説明しているスキーマの更新は、配列や構造体などの複雑なデータタイプやネストされたデータタイプのテーブルでは機能しません。

スキーマを進化させるか、あるいは Athena の使用を継続するかの予想に応じて、互換性のあるデータ形式を選択します。

CSV および Parquet の 2 つの形式で存在する orders テーブルからの命令情報を読み取るアプリケーションを考察します。

以下の例では、Parquet でテーブルを作成します。

CREATE EXTERNAL TABLE orders_parquet ( `orderkey` int, `orderstatus` string, `totalprice` double, `orderdate` string, `orderpriority` string, `clerk` string, `shippriority` int ) STORED AS PARQUET LOCATION 's3://schema_updates/orders_ parquet/';

以下の例では、CSV で同じテーブルを作成します。

CREATE EXTERNAL TABLE orders_csv ( `orderkey` int, `orderstatus` string, `totalprice` double, `orderdate` string, `orderpriority` string, `clerk` string, `shippriority` int ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION 's3://schema_updates/orders_csv/';

以下のセクションでは、これらのテーブルの更新がどのように Athena クエリに影響するかを説明します。

テーブルの先頭または中間に列を追加する

列の追加は最も頻繁なスキーマの変更の 1 つです。たとえば、新しいデータでテーブルをエンリッチ化するために、新しい列を追加することがあります。または、既存の列のソースが変更された場合に新しい列を追加し、この列の以前のバージョンを保持してそれに依存するアプリケーションを調整することもあります。

テーブルの先頭または中間に列を追加し、既存のテーブルに対してクエリを実行するには、SerDe プロパティが名前で読み取るように設定されている場合は、AVRO、JSON、および Parquet と ORC を使用します。詳細については、「Index Access in ORC and Parquet (ORC および Parquet のインデックスアクセス)」を参照してください。

これらの形式は順序に依存するため、CSV および TSV のテーブルの先頭または中間に列を追加しないでください。このような場合に列を追加すると、パーティションのスキーマが変更されたときにスキーマの不一致エラーが発生します。

以下の例では、JSON テーブルの中間に列を追加しています。

CREATE EXTERNAL TABLE orders_json_column_addition ( `o_orderkey` int, `o_custkey` int, `o_orderstatus` string, `o_comment` string, `o_totalprice` double, `o_orderdate` string, `o_orderpriority` string, `o_clerk` string, `o_shippriority` int, `o_comment` string ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' LOCATION 's3://schema_updates/orders_json/';

テーブルの末尾に列を追加する

Athena がサポートする任意の形式 (Parquet、ORC、Avro、JSON、CSV、TSV など) でテーブルを作成する場合、テーブルの末尾に新しい列を追加できます。ORC 形式を使用する場合は、名前で読み取るように ORC を構成する必要があります。Parquet は、デフォルトで名前で読み取ります。詳細については、「Index Access in ORC and Parquet (ORC および Parquet のインデックスアクセス)」を参照してください。

次の例では、Parquet にあるテーブルをドロップして、テーブルの末尾に新しい `comment` 列を持つ新しい Parquet テーブルを追加します。

DROP TABLE orders_parquet; CREATE EXTERNAL TABLE orders_parquet ( `orderkey` int, `orderstatus` string, `totalprice` double, `orderdate` string, `orderpriority` string, `clerk` string, `shippriority` int `comment` string ) STORED AS PARQUET LOCATION 's3://schema_updates/orders_parquet/';

次の例では、CSV にあるテーブルをドロップして、テーブルの末尾に新しい `comment` 列を持つ新しい CSV テーブルを追加します。

DROP TABLE orders_csv; CREATE EXTERNAL TABLE orders_csv ( `orderkey` int, `orderstatus` string, `totalprice` double, `orderdate` string, `orderpriority` string, `clerk` string, `shippriority` int `comment` string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION 's3://schema_updates/orders_csv/';

列の削除

列に含まれるデータがなくなった場合、あるいは列に含まれているデータへのアクセスを制限する場合に、これらの列を削除する必要があることがあります。

  • 名前で読み込まれている場合、JSON、Avro、および Parquet、ORC でテーブルから列を削除することができます。詳細については、「Index Access in ORC and Parquet (ORC および Parquet のインデックスアクセス)」を参照してください。

  • すでに Athena で作成した表を保持する場合は、CSV および TSV のテーブルから列を削除することはお勧めしません。列を削除するとスキーマが壊れ、削除された列がない状態でテーブルを再作成しなければならなくなります。

この例では、Parquet のテーブルから `totalprice` 列を削除して、クエリを実行します。Athena では、Parquet はデフォルトで名前で読み込まれます。そのため、名前で読看取ることを指定する SERDEPROPERTIES 設定を省略しています。スキーマを変更しても、次のクエリは成功することに注意してください。

CREATE EXTERNAL TABLE orders_parquet_column_removed ( `o_orderkey` int, `o_custkey` int, `o_orderstatus` string, `o_orderdate` string, `o_orderpriority` string, `o_clerk` string, `o_shippriority` int, `o_comment` string ) STORED AS PARQUET LOCATION 's3://schema_updates/orders_parquet/';

列の名前変更

綴りを修正するため、列名をより分かりやすくするため、あるいは列の再度の順序変更を回避するために、テーブルで列の名前変更が必要となることがあります。

データを CSV および TSV に保存する場合は列の名前を変更できます。また、インデックスで読み取るように設定されている場合は、Parquet および ORC に保存できます。詳細については、「Index Access in ORC and Parquet (ORC および Parquet のインデックスアクセス)」を参照してください。

Athena は CSV および TSV のデータをスキーマの列順に読み取り、同じ順序で返します。ここでは、データを列にマッピングするために列名を使用しません。このため、Athena クエリを損なうことなく CSV または TSV で列の名前を変更することができます。

この例では、Parquet テーブルで列の名前を `o_totalprice` から `o_total_price` に変更し、Athena でクエリを実行します。

CREATE EXTERNAL TABLE orders_parquet_column_renamed ( `o_orderkey` int, `o_custkey` int, `o_orderstatus` string, `o_total_price` double, `o_orderdate` string, `o_orderpriority` string, `o_clerk` string, `o_shippriority` int, `o_comment` string ) STORED AS PARQUET LOCATION 's3://TBD/schema_updates/orders_parquet/';

Parquet テーブルの場合、次のクエリは実行されますが、列がインデックスではなく名前でアクセスされているため (Parquet のデフォルト)、名前が変更された列にはデータが表示されません。

SELECT * FROM orders_parquet_column_renamed;

CSV のテーブルでのクエリも類似しています。

CREATE EXTERNAL TABLE orders_csv_column_renamed ( `o_orderkey` int, `o_custkey` int, `o_orderstatus` string, `o_total_price` double, `o_orderdate` string, `o_orderpriority` string, `o_clerk` string, `o_shippriority` int, `o_comment` string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION 's3://schema_updates/orders_csv/';

CSV テーブルの場合、次のクエリを実行すると、名前が変更された列を含むすべての列でデータが表示されます。

SELECT * FROM orders_csv_column_renamed;

列の順序変更

デフォルトで名前で読み取る JSON や ORC など、名前で読み取る形式のデータを含むテーブルの列の順序を変更できます。必要であれば、Parquet で名前で読み取ることもできます。詳細については、「Index Access in ORC and Parquet (ORC および Parquet のインデックスアクセス)」を参照してください。

次の例では、例の順序変更を示しています。

CREATE EXTERNAL TABLE orders_parquet_columns_reordered ( `o_comment` string, `o_orderkey` int, `o_custkey` int, `o_orderpriority` string, `o_orderstatus` string, `o_clerk` string, `o_shippriority` int, `o_orderdate` string ) STORED AS PARQUET LOCATION 's3://schema_updates/orders_parquet/';

列のデータ型の変更

列の ID が INT データ型のサイズを超過し、BIGINT データ型に変更する必要がある場合など、列のデータ型が情報量を保持できない場合に、列型を変更します。一部のデータ型のみ他のデータ型に変換することができます。

注記

データ型の変換を実行する前に、クエリをテストして検証することを強くお勧めします。Athena が元のデータ型からターゲットのデータ型にデータ型を変換できない場合、CREATE TABLE クエリは失敗します。

次の表に、変更可能なデータ型を一覧表示します。

互換性のあるデータ型

元のデータ型 使用可能なターゲットデータ型
STRING BYTETINYINTSMALLINTINTBIGINT
BYTE TINYINTSMALLINTINTBIGINT
TINYINT SMALLINTINTBIGINT
SMALLINT INTBIGINT
INT BIGINT
FLOAT DOUBLE

次の orders_json テーブルの例では、`o_shippriority` 列のデータ型を BIGINT に変更します。

CREATE EXTERNAL TABLE orders_json ( `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://schema_updates/orders_json';

次のクエリは、元の SELECT クエリと同様に、データ型が変更される前に正常に実行されます。

Select * from orders_json LIMIT 10;