メニュー
Amazon Athena
ユーザーガイド

スキーマの更新を処理する

このセクションでは、さまざまなデータ形式におけるスキーマの更新を処理するガイドを紹介します。Athena はスキーマの読み取りクエリエンジンです。これは、Athena でテーブルを作成するときに、データの読み取りにスキーマを適用します。基盤となるデータは変更あるいは再作成されません。

テーブルスキーマの変更が予想される場合は、ニーズに適した形式で作成することを検討します。目的としては、進化するスキーマに対して既存の Athena クエリを再利用して、パーティションされたテーブルでクエリを実行するときにスキーマの不一致を回避することです。

重要

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

この目的を達成するには、次のトピックに基づいてテーブルのデータ形式を選択します。

概要: Athena における更新とデータ形式

次のテーブルは、データストレージ形式と、サポートされているスキーマ操作をまとめたものです。このテーブルを使用すると、形式を選択し、スキーマが時間の経過と共に変更しても引き続き Athena クエリを使用するのに役立ちます。

このテーブルでは、Parquet と ORC は、デフォルトの列アクセス方法が異なる列形式であることに注意してください。デフォルトでは、Parquet は名前とインデックス (順序値) による ORC で列にアクセスします。したがって、Athena は、テーブルの作成時に定義された SerDe プロパティを提供して、デフォルトの列アクセス方式を切り替えることで、スキーマの進化に柔軟性を持たせます。

Parquet では、parquet.column.index.access プロパティを TRUE に設定します。これにより、列のアクセス方法で列の順序番号を使用する設定になります。このプロパティを FALSEに設定すると、列のアクセス方法で列名を使用するように変更されます。同様に、ORC ではorc.column.index.access プロパティを使用して列のアクセス方法を制御します。詳細については、「Index Access in ORC and Parquet (ORC および Parquet のインデックスアクセス)」を参照してください。

CSV と TSV を使用すると、列の並べ替えやテーブルの先頭に列を追加する以外のすべてのスキーマ操作を実行できます。たとえば、スキーマの変更で列の名前を変更するだけで、列の名前を削除する必要がない場合は、CSV または TSV でテーブルを作成することができます。列を削除する必要がある場合は、CSV または TSV を使用せず、その他のサポートされている形式のいずれかを使用します。好ましいのは、Parquet または ORC などの列方向の形式です。

Athena におけるスキーマの更新とデータ形式

予想されるスキーマ更新のタイプ 概要 CSV (ヘッダー有りあるいはなし) および TSV JSON AVRO PARQUET: 名前で読み取る (デフォルト) PARQUET: インデックスで読み取る ORC: インデックスで読み取る (デフォルト) ORC: 名前で読み取る
列の名前変更 データを CSV および TSV に保存するか、ORC および Parquet でインデックスに読み込んだ場合に保存します。 Y N N N Y Y N
テーブルの先頭または中間に列を追加する データを JSON、AVRO に保存するか、Parquet および ORC で名前に読み込んだ場合に保存します。CSV や TSV を使用しないでください。 N Y Y Y N N Y
テーブルの末尾に列を追加する データを CSV に保存するか、TSV、JSON、AVRO、ORC および Parquet で名前に読み込んだ場合に保存します。 Y Y Y Y N N Y
列の削除 データを JSON、AVRO に保存するか、Parquet および ORC で名前に読み込んだ場合に保存します。CSV や TSV を使用しないでください。 N Y Y Y N N Y
列の順序変更 データを AVRO、JSON に保存するか、ORC および Parquet で名前に読み込んだ場合に保存します。 N Y Y Y N N Y
列のデータ型の変更 任意の形式でデータを保存できますが、データ型に互換性があることを確認するために Athena でクエリをテストします。 Y Y Y Y Y Y Y

Parquet および ORC におけるインデックスアクセス

PARQUET および ORC は、インデックス引または名前で読み取り可能な列データストレージ形式です。これらの形式のいずれかでデータを保存すると、スキーマのすべてのオペレーションを実行し、スキーマの不一致エラーなしで Athena クエリを実行できます。

  • Athena は、SERDEPROPERTIES ( 'orc.column.index.access'='true') に定義されているように、デフォルトで ORC をインデックスで読み取ります。詳細については、「ORC: インデックスで読み取る」を参照してください。

  • Athena は、SERDEPROPERTIES ( 'parquet.column.index.access'='false') に定義されているように、デフォルトで Parquet を名前で読み取ります。詳細については、「PARQUET: 名前で読み取る」を参照してください。

これらはデフォルトであるため、これらの SerDe プロパティを CREATE TABLE クエリで使用するのはオプションで、暗黙的に使用されます。これらを使用すると、、他のオペレーションを防ぎながら、スキーマの更新オペレーションを実行することができます。これらのオペレーションを有効にするには、別の CREATE TABLE クエリを実行し、SerDe の設定を変更します。

以下のセクションで、これらのケースについて詳しく説明します。

ORC: インデックスで読み取る

ORC 内のテーブルは、デフォルトでインデックスで読み取られます。これは、次の構文で定義されます。

WITH SERDEPROPERTIES ( 'orc.column.index.access'='true')

インデックスで読み取ると、列の名前を変更できます。ただし、列の削除やテーブルの中間での追加ができなくなります。

ORC を名前で読み取り、テーブルの中間に列を追加したり、ORC の列を削除したりするには、CREATE TABLE ステートメントで、SerDe プロパティ orc.column.index.accessFALSE に設定します。この設定では、列の名前を変更する機能が失われます。

次の例は、ORC を変更して名前で読み取る方法を示しています。

CREATE EXTERNAL TABLE orders_orc_read_by_name ( `o_comment` string, `o_orderkey` int, `o_custkey` int, `o_orderpriority` string, `o_orderstatus` string, `o_clerk` string, `o_shippriority` int, `o_orderdate` string ) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde' WITH SERDEPROPERTIES ( 'orc.column.index.access'='false') STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat' LOCATION 's3://schema_updates/orders_orc/';

Parquet: 名前で読み取る

Parquet のテーブルはデフォルトで名前で読み取られます。これは、次の構文で定義されます。

WITH SERDEPROPERTIES ( 'parquet.column.index.access'='false')

名前で読み取ると、テーブルの中間に列を追加したり、列を削除したりできます。ただし、列の名前を変更することができなくなります。

Parquet にインデックスで読み取らせて列の名前を変更できるようにするには、 parquet.column.index.access SerDe プロパティを TRUE に設定してテーブルを作成する必要があります。