INSERT (外部テーブル) - Amazon Redshift

INSERT (外部テーブル)

SELECT クエリの結果を、AWS Glue、AWS Lake Formation、Apache Hive メタストアなどの外部カタログの既存の外部テーブルに挿入します。CREATE EXTERNAL SCHEMA コマンドに使用されるのと同じ AWS Identity and Access Management (IAM) ロールを使用して、外部カタログおよび Amazon S3 とのやり取りを行います。

パーティション分割されていないテーブルの場合、INSERT (外部テーブル) コマンドは、指定されたテーブルプロパティとファイル形式に基づいて、テーブルで定義された Amazon S3 の場所にデータを書き込みます。

パーティション分割されたテーブルの場合、INSERT (外部テーブル) は、テーブルで指定されたパーティションキーに従って、Amazon S3 の場所にデータを書き込みます。また、INSERT オペレーションの完了後、新しいパーティションを外部カタログに自動的に登録します。

トランザクションブロック (BEGIN ... END) 内で INSERT を (外部テーブル) 実行することはできません。トランザクションの詳細については、「直列化可能分離」を参照してください。

構文

INSERT INTO external_schema.table_name { select_statement }

パラメータ

external_schema.table_name

既存の外部スキーマと挿入するターゲット外部テーブルの名前。

select_statement

クエリを定義して 1 つ以上の行を外部テーブルに挿入するステートメント。クエリによって生成されるすべての行は、テーブル定義に基づいて、テキストまたは Parquet 形式で Amazon S3 に書き込まれます。クエリは、外部テーブルの列のデータ型と互換性のある列リストを返す必要があります。ただし、列名は一致する必要はありません。

使用に関する注意事項

SELECT クエリの列数は、データ列とパーティション列の合計と同じであることが必要です。各データ列の場所とデータ型は、外部テーブルのものと一致する必要があります。パーティション列の場所は、CREATE EXTERNAL TABLE コマンドで定義されたのと同じ順序で、SELECT クエリの最後にあることが必要です。列名は一致する必要はありません。

場合によっては、AWS Glueデータカタログまたは Hive メタストアに対して INSERT (外部テーブル) コマンドを実行する必要があります。AWS Glue の場合、外部スキーマの作成に使用される IAM ロールには、Amazon S3 と AWS Glue に対する読み取りと書き込みの両方のアクセス許可が必要です。AWS Lake Formation カタログを使用する場合、この IAM ロールが新しい Lake Formation テーブルの所有者になります。この IAM ロールには、少なくとも以下のアクセス許可が必要です。

  • 外部テーブルに対する SELECT、INSERT、UPDATE アクセス許可

  • 外部テーブルの Amazon S3 パスに対するデータの場所のアクセス許可

ファイル名が必ず一意になるように、Amazon Redshift ではデフォルトで、Amazon S3 にアップロードされる各ファイルの名前に以下の形式が使用されます。

<date>_<time>_<microseconds>_<query_id>_<slice-number>_part_<part-number>.<format>.

例は 20200303_004509_810669_1007_0001_part_00.parquet です。

INSERT (外部テーブル) コマンドを実行するときは、以下の点を考慮してください。

  • PARQUET または TEXTFILE 以外の形式の外部テーブルはサポートされていません。

  • このコマンドは、'write.parallel'、'write.maxfilesize.mb'、'compression_type'、'serialization.null.format' などの既存のテーブルプロパティをサポートしています。これらの値を更新するには、ALTER TABLE SET TABLE PROPERTIES コマンドを実行します。

  • 'numRows' テーブルプロパティは、INSERT オペレーションの最後に向かって自動的に更新されます。テーブルプロパティは、CREATE EXTERNAL TABLE AS オペレーションによって作成されていない場合、テーブルに定義または追加する必要があります。

  • LIMIT 句は、外側の SELECT クエリではサポートされていません。代わりに、ネストされた LIMIT 句を使用してください。

  • STL_UNLOAD_LOG テーブルを使用して、各 INSERT (外部テーブル) オペレーションによって Amazon S3 に書き込まれたファイルを追跡できます。

  • Amazon Redshift は、INSERT (外部テーブル) に対する Amazon S3 の標準暗号化のみをサポートします。

INSERT (外部テーブル) の例

以下の例では、SELECT ステートメントの結果を外部テーブルに挿入します。

INSERT INTO spectrum.lineitem SELECT * FROM local_lineitem;

以下の例では、静的パーティション分割を使用して、SELECT ステートメントの結果をパーティション分割された外部テーブルに挿入します。パーティション列は SELECT ステートメントでハードコーディングされています。パーティション列はクエリの最後にあることが必要です。

INSERT INTO spectrum.customer SELECT name, age, gender, 'May', 28 FROM local_customer;

以下の例では、動的パーティション分割を使用して、SELECT ステートメントの結果をパーティション分割された外部テーブルに挿入します。パーティション列はハードコーディングされていません。データは自動的に、既存のパーティションフォルダに追加されるか、または新しいパーティションが追加された場合は新しいフォルダに追加されます。

INSERT INTO spectrum.customer SELECT name, age, gender, month, day FROM local_customer;