INSERT INTO - Amazon Athena

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

INSERT INTO

根據來源資料表上執行的 SELECT 查詢陳述式,或根據作為該陳述式的一部分提供的一組 VALUES,將新資料行插入目標資料表。當來源資料表以某一格式 (例如 CSV 或 JSON) 的基礎資料為基礎時,而目標資料表以另一種格式 (例如 Parquet 或 ORC) 為基礎,則您可以使用 INSERT INTO 查詢,將選取的資料轉換為目標資料表的格式。

考量與限制

搭配 Athena 使用 INSERT 查詢時,請考慮以下情況:

  • 在包含於 Amazon S3 中加密的基礎資料的資料表上執行 INSERT 查詢時,INSERT 查詢寫入的輸出檔案依預設不會加密。如果您要插入具有加密資料的資料表,建議您加密 INSERT 查詢結果。

    如需使用主控台加密查詢結果的詳細資訊,請參閱加密 Amazon S3 中存放的 Athena 查詢結果。若要使用 AWS CLI 或 Athena API 啟用加密,請使用StartQueryExecution動作的EncryptionConfiguration屬性根據您的需求指定 Amazon S3 加密選項。

  • 對於 INSERT INTO 陳述式,預期的儲存貯體擁有者設定不適用於 Amazon S3 中的目的地資料表位置。預期的儲存貯體擁有者設定僅適用於您為 Athena 查詢結果指定的 Amazon S3 輸出位置。如需詳細資訊,請參閱 使用 Athena 主控台指定查詢結果位置

  • 如需 ACID 合規 INSERT INTO 陳述式,則請參閱 更新 Iceberg 資料表資料INSERT INTO 一節。

支援的格式和 SerDes

您可以在使用下列格式和的資料建立的資料表上執行INSERT查詢 SerDes。

資料格式 SerDe

Avro

或. 阿帕切 .hadoop.HIVE. 服務 2. AvroSerDe

Ion am. 亞馬遜。離子組織. IonHiveSerDe

JSON

或者 .apache.H 目錄. JsonSerDe

ORC

組織. 阿帕切. 哈多普. 生存 .QL.io. OrcSerde

Parquet

或者阿帕奇 .hadoop.hive.ql.io.parquet.serde. ParquetHiveSerDe

文字檔案

或者 .apache.hadoop.hive. 服務器 2. LazySimpleSerDe

注意

支援 CSV、TSV 和自訂分隔檔案。

不支援分區資料表

在分區資料表上不支援 INSERT INTO。如需詳細資訊,請參閱 在 Athena 中分割和歸納

不支援聯合查詢

INSERT INTO 不支援聯合查詢。嘗試執行這項操作可能會產生錯誤訊息:外部目錄目前不支援此操作。如需聯合查詢的詳細資訊,請參閱使用 Amazon Athena 聯合查詢

分割

搭配 INSERT INTOCREATE TABLE AS SELECT 查詢使用分割區時,請將本章節的幾個重點納入考量。

限制

INSERT INTO 陳述式支援最多將 100 個分割區寫入目標資料表。如果您在分割區超過 100 個的資料表上執行 SELECT 子句,除非 SELECT 查詢限制在 100 個分割區或更少,否則查詢會失敗。

如需解決此限制的相關資訊,請參閱使用 CTAS 和 INSERT INTO 來解決 100 個分割區限制

資料欄排序

INSERT INTOCREATE TABLE AS SELECT 陳述式會預期分割的資料欄為 SELECT 陳述式中投影資料欄清單的最後一個資料欄。

如果來源資料表未經分割,或與目標資料表相比在不同的資料欄上分割,則如 INSERT INTO destination_table SELECT * FROM source_table 的查詢會將來源資料表中的最後一個資料欄的值,認定為目標資料表中的分割區資料欄的值。嘗試從未分割的資料表建立分割的資料表時,請注意以上提醒。

資源

如需有關搭配分割使用 INSERT INTO 的詳細資料,請參閱以下資源。

寫入 Amazon S3 的檔案

INSERT 命令執行之後,Athena 會將檔案寫入 Amazon S3 中的來源資料位置。每個 INSERT 操作都會建立新的檔案,而不是附加到現有的檔案。檔案位置取決於資料表和 SELECT 查詢的結構 (若有)。Athena 會為每個 INSERT 查詢生成一個資訊清單檔案。資訊清單會追蹤查詢寫入的檔案。它會儲存到 Amazon S3 中的 Athena 查詢結果位置。如需詳細資訊,請參閱 識別查詢輸出檔案

避免高度交易更新

當您使用將資料列新增INSERT INTO至 Amazon S3 中的資料表時,Athena 不會重寫或修改現有檔案。相反地,它會將資料列寫入為一或多個新檔案。由於包含許多小檔案的資料表會導致查詢效能降低,而且寫入和讀取操作 (例如 PutObject Amazon S3 會產生較高的成本),GetObject因此在使用時請考慮下列選項INSERT INTO

  • 在較大批次的資料列上執行INSERT INTO作業的頻率較低。

  • 對於大型資料擷取磁碟區,請考慮使用 Amazon 資料 Fire hose 之類的服務。

  • INSERT INTO完全避免使用。相反地,將資料列累積成較大的檔案,然後直接上傳到 Amazon S3,Athena 就能查詢這些資料列。

尋找孤立檔案

如果 CTASINSERT INTO 陳述式失敗,該資料位置可能遺留孤立的資料。由於 Athena 不會從儲存貯體中刪除任何資料 (甚至是部分資料),因此您可以在後續查詢中讀取此部分資料。若要尋找孤立檔案以進行檢測或刪除,您可以使用 Athena 提供的資料資訊清單檔案來追蹤要寫入的檔案清單。如需詳細資訊,請參閱 識別查詢輸出檔案DataManifestLocation

INSERT INTO...SELECT

指定在一個資料表上執行的查詢:source_table,這會決定要插入第二個資料表的資料列: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 資料表中的列,其中 date 資料欄有介於 2019-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';

請僅從 country 資料欄中 usa 的值選取 cities_world 資料表中 citystate 欄內的值,並將其插入 cities_usa 資料表中的 citystate 欄:

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

INSERT INTO... VALUES

透過指定資料欄和值,將資料列插入現有的資料表。指定的資料欄和相關聯的資料類型必須精確地符合目標資料表中的資料欄和資料類型。

重要

我們不建議使用 VALUES 插入資料行,因為 Athena 會為每個 INSERT 操作產生檔案。這可能會導致建立許多小型檔案,並降低資料表的查詢效能。若要識別 INSERT 查詢建立的檔案,請檢查資料資訊清單檔案。如需詳細資訊,請參閱 使用查詢結果、近期查詢和輸出檔案

概要

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

範例

在下列範例中,城市資料表有三個資料欄:idcitystatestate_mottoid 資料欄的類型是 INT,而其他所有欄的類型都是 VARCHAR

將單一列插入 cities 資料表,並指定所有資料欄值:

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

cities 資料表中插入兩列:

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