CTAS クエリに関する考慮事項と制約事項 - Amazon Athena

CTAS クエリに関する考慮事項と制約事項

以下のセクションでは、Athena で CREATE TABLE AS SELECT (CTAS) クエリを使用する際に留意すべき考慮事項と制限事項について説明します。

CTAS クエリ構文について知る

CTAS クエリ構文は、テーブル作成用の CREATE [EXTERNAL] TABLE 構文とは異なります。「CREATE TABLE AS」を参照してください。

ビューと CTAS クエリの違い

CTAS クエリは、Amazon S3 内の指定された場所に新しいデータを書き込みます。ビューはデータを書き込みません。

CTAS クエリ結果の場所を指定する

ワークグループがクエリ結果の場所に関するクライアント側の設定を上書きする場合、Athena は s3://amzn-s3-demo-bucket/tables/<query-id>/ の場所にテーブルを作成します。ワークグループに指定されたクエリ結果の場所を表示するには、ワークグループの詳細を表示します

ワークグループがクエリ結果の場所を上書きしない場合は、CTAS クエリの構文 WITH (external_location ='s3://amzn-s3-demo-bucket/') を使用して、CTAS クエリ結果の保存場所を指定できます。

注記

external_location プロパティは、空の場所を指定する必要があります。CTAS クエリはバケットのパス位置 (プレフィックス) が空であるかどうかをチェックして、その場所に既にデータが含まれる場合は、データを上書きしません。同じ場所を再度使用するには、バケット内のキープレフィックスの場所のデータを削除します。

external_location 構文を省略しており、ワークグループ設定を使用していない場合、Athena はクエリ結果の場所にクライアント側の設定を使用し、s3://amzn-s3-demo-bucket/<Unsaved-or-query-name>/<year>/<month/<date>/tables/<query-id>/ の場所にテーブルを作成します。

孤立したファイルを見つける

CTAS または INSERT INTO ステートメントが失敗した場合、孤立したデータがデータの場所に残っている可能性があります。Athena は場合によってはバケットからデータまたは部分データを削除しないため、後続のクエリでこの部分データが読み込み可能になる可能性があります。検査または削除する孤立したファイルを見つけるには、Athena に用意されているデータマニフェストファイルを使用して、書き込まれるファイルのリストを追跡できます。詳細については、「クエリ出力ファイルを識別する」および「DataManifestLocation」を参照してください。

ORDER BY 句は無視されることに留意してください

CTAS クエリでは、Athena はクエリの SELECT 部分にある ORDER BY 句を無視します。

SQL 仕様 (ISO 9075 Part 2) では、クエリ式で指定されたテーブル行の順序が保証されるのは、ORDER BY 句が直後に含まれるクエリ式だけです。SQL のテーブルはどのような場合でも本来は順序付けられておらず、ORDER BY をサブクエリ句に追加してもクエリのパフォーマンスが低下するだけで、出力は順序付けられません。したがって、Athena CTAS クエリでは、データが書き込まされた際に ORDER BY 句によって指定された順序が保持される保証はありません。

クエリ結果を保存する形式を選択する

CTAS の結果は、PARQUETORCAVROJSON、および TEXTFILE で保存できます。CTAS TEXTFILE 形式では複数文字の区切り文字がサポートされません。データの保存形式を指定しない場合、CTAS クエリ結果はデフォルトで Parquet に保存されます。

CTAS クエリでは形式の変換を解釈するために SerDe を指定する必要はありません。「Example: Writing query results to a different format」を参照してください。

圧縮形式を検討する

JSON 形式と TEXTFILE 形式の CTAS クエリ結果には、GZIP 圧縮が使用されます。Parquet の場合、デフォルトは GZIP で、GZIP または SNAPPY も使用可能です。ORC の場合、デフォルトは ZLIB で、LZ4SNAPPYZLIB、または ZSTD も使用できます。圧縮を指定する CTAS の例については、Example: Specifying data storage and compression formats を参照してください。Athena での圧縮の詳細については、「Athena で圧縮を使用する」を参照してください。

結果をパーティショニングおよびバケット化する

CTAS クエリの結果データをパーティションおよびバケット化することができます。宛先テーブルのプロパティを指定するには、WITH 句の最後にパーティショニング述語およびバケット述語を含めます。詳細については、パーティショニングとバケット化を使用するおよびExample: Creating bucketed and partitioned tablesを参照してください。

CTAS を使用してパーティショニングされたテーブルを作成する場合、Athena には 100 のパーティションの書き込み制限があります。100 パーティションの制限を回避する方法については、「CTAS および INSERT INTO を使用して 100 パーティションの制限を回避する」を参照してください。

結果を暗号化する

CTAS クエリの結果は Amazon S3 で暗号化することができます。これは Athena で他のクエリ結果を暗号化する方法と似ています。詳細については、「Amazon S3 に保存された Athena クエリ結果を暗号化する」を参照してください。

想定されるバケット所有者設定は CTAS には適用されません

CTAS ステートメントの場合、予想されるバケット所有者の設定は、Amazon S3 内の送信先テーブルの場所には適用されません。予期されるバケット所有者の設定は、Athena クエリの結果の出力先として指定した Amazon S3 内の場所にのみ適用されます。詳細については、「Athena コンソールを使用してクエリ結果の場所を指定する」を参照してください。

列のデータ型は保持されます

CTAS クエリの列のデータ型は元のクエリに指定されているものと同じです。