Amazon Athena
ユーザーガイド

パーティションがあるテーブルを更新する

Athena では、テーブルとそのパーティションでは同じデータ形式を使用する必要がありますが、スキーマは異なる場合があります。新しいパーティションを作成するとき、このパーティションは通常テーブルのスキーマを継承します。時間の経過とともに、このスキーマが変わり始める場合があります。その理由には次のようなものがあります。

  • テーブルのスキーマの場合、パーティションのスキーマはテーブルのスキーマと同期するために更新されません。

  • AWS Glue クローラでは、異なるスキーマのパーティションからデータを検出することができます。つまり、Athena の AWS Glue でテーブルを作成した場合、クローラの処理が終了すると、テーブルのスキーマとそのパーティションは異なる場合があります。

  • AWS API を使用して、直接パーティションを追加した場合。

Athena は以下の制約を満たす場合に、パーティションがあるテーブルを正常に処理します。これらの制約が満たされない場合、Athena は HIVE_PARTITION_SCHEMA_MISMATCH エラーを発行します。

  • 各パーティションのスキーマがテーブルのスキーマと互換性があること。

  • テーブルのデータ形式が実行する更新のタイプを許可すること (追加、削除、列の順序変更あるいは列のデータ型の変更)。

    たとえば、CSV および TSV 形式では列の名前変更、新しい列のテーブル末尾への追加および型に互換性がある場合の列のデータ型の変更のみを行うことができ、列を削除することはできません。その他の形式では、列の追加あるいは削除、型に互換性がある場合の列のデータ型の別への変更ができます。詳細については、「概要: Athena における更新とデータ形式」を参照してください。

重要

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

パーティションがあるテーブルのスキーマの不一致エラーを回避する

クエリの実行開始時、Athena は各列のデータ型がテーブルとパーティション間で互換性があるかを確認して、テーブルのスキーマを検証します。

  • Parquet および ORC データストレージ型の場合は、Athena は列の名前に依存し、これを使用して列の名前に基づいたスキーマ検証を行います。これにより、Parquet および ORC のパーティションがあるテーブルの HIVE_PARTITION_SCHEMA_MISMATCH エラーが解消されます。(ORC では、SerDe プロパティが名前でインデックスにアクセスするように設定されている場合にこれが機能します。orc.column.index.access=FALSE。Parquet はデフォルトで名前でインデックスを読み取ります。)

  • CSV、JSON、および Avro の場合、Athena はインデックスベースのスキーマ検証を使用します。つまり、スキーマ不一致エラーが発生した場合、スキーマ不一致の原因となるパーティションを削除して置き換えることで、Athena で失敗なくクエリを実行できます。

Athena は、テーブルのスキーマとパーティションのスキーマを比較します。Athena の AWS Glue クローラで CSV、JSON、および AVRO でテーブルを作成した場合、クローラの処理が終了すると、テーブルのスキーマとそのパーティションは異なる場合があります。テーブルのスキーマとパーティションのスキーマ間に不一致がある場合、Athena のクエリは次のようなスキーマ検証エラーによって失敗します。「crawler_test.click_avro」は「文字列」タイプと宣言されていますが、パーティション「partition_0=2017-01-17」は「col68」列を「ダブル」タイプと宣言しています。

このようなエラーを回避する一般的な対処法は、エラーの原因となるパーティションを削除して、再製作することです。