INSERT (外部資料表) - Amazon Redshift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

INSERT (外部資料表)

將 SELECT 查詢的結果插入到外部目錄上的現有外部資料表,例如 AWS Glue、AWS Lake Formation 或 Apache Hive 中繼存放區。使用相同的AWS Identity and Access Management(IAM) 角色,用於 CREATE EXTERNAL SCHEMA 命令以和外部目錄和 Amazon S3 互動。

對於未分割的資料表,INSERT (外部表格) 命令會根據指定的資料表屬性和檔案格式,將資料寫入資料表中定義的 Amazon S3 位置。

對於分割的資料表,INSERT (外部資料表) 會根據資料表中指定的分割區索引鍵,將資料寫入 Amazon S3 位置。它也會在 INSERT 操作完成之後,自動在外部目錄中註冊新的分割區。

您不能在交易區塊 (BEGIN ...) 內執行 INSERT (外部資料表) END)。如需交易的詳細資訊,請參閱 可序列化隔離

Syntax (語法)

INSERT INTO external_schema.table_name { select_statement }

參數

external_schema.table_name

現有外部資料結構描述的名稱和要插入的目標外部資料表。

select_statement

透過定義任何查詢,將一或多個列插入外部資料表的陳述式。查詢產生的所有列都會根據資料表定義,以文字或 Parquet 格式寫入 Amazon S3。查詢必須傳回與外部資料表中的欄位資料類型相容的欄位清單。不過,欄位名稱不一定要相符。

使用須知

SELECT 查詢中的欄位數必須與資料欄位和分割區欄位的總和相同。每個資料欄的位置和資料類型必須與外部資料表的資料類型相符。分割區欄位的位置必須在 SELECT 查詢的結尾,與它們在 CREATE EXTERNAL TABLE 命令定義的順序相同。欄位名稱不一定要相符。

在某些情況下,您可能想要在 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;