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

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

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

CTAS クエリ構文

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

注記

CTAS クエリのテーブル、データベース、または列名には、引用符やバックティックを含めることはできません。そのために、テーブル、データベース、または列名が予約語を表していないこと、および特殊文字が含まれていないことを確認します (引用符またはバックティックで囲む必要があります)。詳細については、「テーブル、データベース、および列の名前」を参照してください。

CTAS クエリとビューの違い

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

CTAS クエリ結果の場所

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

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

注記

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

external_location 構文を省略しており、ワークグループ設定を使用していない場合、Athena はクエリ結果の場所にクライアント側の設定を使用し、s3://<client-query-results-location>/<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 クエリの結果は、デフォルトで Parquet 形式で保存されます (データストレージ形式を指定しない場合)。CTAS の結果は、PARQUETORCAVROJSON、および TEXTFILE で保存できます。CTAS TEXTFILE 形式では複数文字の区切り文字がサポートされません。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 クエリの結果データをパーティションおよびバケット化することができます。詳細については、「Athena におけるパーティション化とバケット化」を参照してください。Athena は、100 個の一意のパーティションとバケットの組み合わせへの書き込みをサポートします。たとえば、宛先テーブルにバケットが定義されていない場合、最大 100 個のパーティションを指定できます。バケットを 5 個指定すると、(それぞれ 5 個のバケットを持つ) 20 個のパーティションが許可されます。この数を超えると、エラーが発生します。

宛先テーブルのプロパティを指定する WITH 句の最後に、パーティションとバケット化の述語を含めます。詳細については、Example: Creating bucketed and partitioned tables および Athena におけるパーティション化とバケット化 を参照してください。

100 パーティションの制限を回避する方法については、「CTAS および INSERT INTO を使用して 100 パーティションの制限を回避する」を参照してください。

Encryption

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

予想されるバケット所有者

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

データ型

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