INSERT INTO - Amazon Athena

INSERT INTO

ソーステーブルで実行される SELECT クエリステートメント、またはそのステートメントの一部として提供される VALUES のセットに基づいて、宛先テーブルに新しい行を挿入します。ソーステーブルが CSV や JSON などの形式の基盤データに基づくもので、宛先テーブルが Parquet や ORC など別の形式に基づいている場合は、INSERT INTO クエリを使用して、選択したデータを宛先テーブルの形式に変換できます。

考慮事項と制約事項

Athena で INSERT クエリを使用するときは、以下の点を考慮してください。

  • Amazon S3 で暗号化された基盤データがあるテーブルに対して INSERT クエリを実行する場合、INSERT クエリが書き込む出力ファイルはデフォルトで暗号化されません。暗号化されたデータを含むテーブルに INSERT クエリの結果を挿入する場合は、結果を暗号化することが推奨されます。

    コンソールを使用したクエリ結果の暗号化の詳細については、「Amazon S3 に保存された Athena のクエリ結果の暗号化 JDBC または ODBC を使用する場合の Athena のクエリ結果の暗号化」を参照してください。AWS CLI または Athena API を使用した暗号化を有効にするには、StartQueryExecution アクションの EncryptionConfiguration プロパティを使用して、要件に沿った Amazon S3 暗号化オプションを指定します。

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

サポートされる形式と SerDes

以下の形式と SerDes を使用して、データから作成されたテーブルに対して INSERT クエリを実行できます。

データ形式 SerDe

Avro

org.apache.hadoop.hive.serde2.avro.AvroSerDe

JSON

org.apache.hive.hcatalog.data.JsonSerDe

ORC

org.apache.hadoop.hive.ql.io.orc.OrcSerde

Parquet

org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe

テキストファイル

org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe

注記

CSV、TSV、およびカスタム区切りファイルがサポートされています。

バケット化されたテーブルはサポートされていません

INSERT INTO はバケット化されたテーブルではサポートされていません。詳細については、「バケット化とパーティション分割の比較」を参照してください。

横串検索はサポートされていません

横串検索では、INSERT INTO はサポートされていません。これを試みた場合、「This operation is currently not supported for external catalogs (この操作は現在、外部カタログではサポートされていません)」というエラーメッセージが表示されることがあります。横串検索の詳細については、「Amazon Athena 横串検索の使用」を参照してください。

パーティション

INSERT INTO または CREATE TABLE AS SELECT クエリでパーティション分割を使用するときは、このセクションの要点を考慮してください。

制限

INSERT INTO ステートメントは、宛先テーブルへの最大 100 個のパーティションの書き込みをサポートします。100 個を超えるパーティションを持つテーブルで SELECT 句を実行すると、SELECT クエリは、100 個以下のパーティションに制限されない限り失敗します。

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

列の順序

INSERT INTO または CREATE TABLE AS SELECT ステートメントは、SELECT ステートメントで射影された列のリストの最後の列がパーティション分割された列であることを期待します。

ソーステーブルがパーティション分割されていない場合、または宛先テーブルとは異なる列でパーティション分割されている場合、INSERT INTO destination_table SELECT * FROM source_table のようなクエリは、ソーステーブルの最後の列の値が宛先テーブルのパーティション列の値であると見なします。パーティション分割されていないテーブルからパーティションテーブルを作成するときは、この点に留意してください。

リソース

パーティション分割での INSERT INTO の使用に関する詳細については、以下のリソースを参照してください。

Amazon S3 に書き込まれるファイル

Athena は、INSERT コマンドの結果として、Amazon S3 のソースデータの場所にファイルを書き込みます。各 INSERT オペレーションは、既存のファイルに付加するのではなく、新しいファイルを作成します。ファイルの場所は、テーブルの構造と SELECT クエリ (存在する場合) に応じて異なります。Athena は、INSERT クエリごとにデータマニフェストファイルを生成します。マニフェストは、クエリが書き込んだファイルを追跡します。これは、Amazon S3 にある Athena のクエリ結果の場所に保存されます。詳細については、「」を参照してくださいクエリ出力ファイルの識別

孤立したファイルの検索

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

INSERT INTO...SELECT

1 つのテーブル、source_table に対して実行するクエリを指定します。これにより、2 番目のテーブル、destination_table に挿入する行が決定されます。SELECT クエリが source_table での列を指定する場合、その列は destination_table の列と正確に一致する必要があります。

SELECT クエリの詳細については、「SELECT」を参照してください。

概要

INSERT INTO destination_table SELECT select_query FROM source_table_or_view

vancouver_pageviews テーブル内のすべての行を選択し、canada_pageviews テーブルに挿入します。

INSERT INTO canada_pageviews SELECT * FROM vancouver_pageviews;

vancouver_pageviews 列の値が date2019-07-012019-07-31 テーブル内の行のみを選択し、canada_july_pageviews に挿入します。

INSERT INTO canada_july_pageviews SELECT * FROM vancouver_pageviews WHERE date BETWEEN date '2019-07-01' AND '2019-07-31';

city テーブルの statecities_world 列で、usa 列の値が country の行だけを選択して、city テーブルの statecities_usa 列に挿入します。

INSERT INTO cities_usa (city,state) SELECT city,state FROM cities_world WHERE country='usa'

INSERT INTO...VALUES

列と値を指定して、既存のテーブルに行を挿入します。指定された列と関連するデータ型は、宛先テーブルの列およびデータ型と正確に一致する必要があります。

重要

Athena は INSERT オペレーションごとにファイルを生成するため、VALUES を使用した行の挿入は推奨されません。これにより、多数の小さなファイルが作成され、テーブルのクエリパフォーマンスが低下する可能性があります。INSERT クエリが作成するファイルを識別するには、データマニフェストファイルを調べます。詳細については、「クエリ結果、最近のクエリ、および出力ファイルの使用」を参照してください。

概要

INSERT INTO destination_table [(col1,col2,...)] VALUES (col1value,col2value,...)[, (col1value,col2value,...)][, ...]

次の例では、都市テーブルには、idcitystatestate_motto の 3 つの列があります。id 列は INT 型で、他のすべての列は VARCHAR 型です。

cities テーブルに 1 つの行を挿入し、すべての列の値を指定します。

INSERT INTO cities VALUES (1,'Lansing','MI','Si quaeris peninsulam amoenam circumspice')

cities テーブルに 2 行を挿入します。

INSERT INTO cities VALUES (1,'Lansing','MI','Si quaeris peninsulam amoenam circumspice'), (3,'Boise','ID','Esto perpetua')