INSERT(外部表格) - Amazon Redshift

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

INSERT(外部表格)

將SELECT查詢結果插入外部目錄上現有的外部資料表,例如 for AWS Glue AWS Lake Formation、或 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指令中定義的順序相同。欄位名稱不一定要相符。

在某些情況下,您可能想要在 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'。若要更新這些值,請執行ALTERTABLESETTABLEPROPERTIES命令。

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

  • 外部SELECT查詢中不支持該LIMIT子句。而是使用巢狀LIMIT子句。

  • 您可以使用STL_UNLOAD_LOG表格來追蹤透過每個 INSERT (外部資料表) 作業寫入 Amazon S3 的檔案。

  • Amazon Redshift 僅支持 Amazon S3 標準加密INSERT(外部表)。

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;