INSERT (外部資料表) - Amazon Redshift

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

INSERT (外部資料表)

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

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

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

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

語法

INSERT INTO external_schema.table_name { select_statement }

參數

external_schema.table_name

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

select_statement

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

使用須知

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

在某些情況下,您可能想要在 Data Catalog 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(外部資料表) 命令時,請考慮下列事項:

  • TEXTFILE 不支援格式為 PARQUET或 以外的外部資料表。

  • 此命令支援現有的資料表屬性,如 'write.parallel'、'write.maxfilesize.mb'、'compression_type’ 和 'serialization.null.format'。若要更新這些值,請執行 ALTERTABLESETTABLEPROPERTIES命令。

  • 'numRows' 資料表屬性會在INSERT操作結束時自動更新。如果不是由 CREATE EXTERNAL TABLE AS 操作建立,則必須定義資料表屬性或將其新增至資料表。

  • 外部SELECT查詢不支援子LIMIT句。反之,請使用巢狀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;