選取您的 Cookie 偏好設定

我們使用提供自身網站和服務所需的基本 Cookie 和類似工具。我們使用效能 Cookie 收集匿名統計資料,以便了解客戶如何使用我們的網站並進行改進。基本 Cookie 無法停用,但可以按一下「自訂」或「拒絕」以拒絕效能 Cookie。

如果您同意,AWS 與經核准的第三方也會使用 Cookie 提供實用的網站功能、記住您的偏好設定,並顯示相關內容,包括相關廣告。若要接受或拒絕所有非必要 Cookie,請按一下「接受」或「拒絕」。若要進行更詳細的選擇,請按一下「自訂」。

INSERT INTO

焦點模式
INSERT INTO - Amazon Athena

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

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

根據來源資料表上執行的 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

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

資料格式 SerDe

Avro

org.apache.hadoop.hive.serde2.avro.AvroSerDe

Ion com.amazon.ionhiveserde.IonHiveSerDe

JSON

org.apache.hive.hcatalog.data.JsonSerDe

ORC

org.apache.hadoop.hive.ql.io.orc.OrcSerde

Parquet

org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe

文字檔案

org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe

注意

支援 TSV 和自訂分隔檔案。

CSV org.apache.hadoop.hive.serde2.OpenCSVSerde
注意

只有字串類型支援寫入。從 Athena,您無法寫入任何在 Glue 結構描述中包含非字串類型的資料表。如需詳細資訊,請參閱 CSV SerDe

不支援分區資料表

在分區資料表上不支援 INSERT INTO。如需詳細資訊,請參閱使用分割和儲存貯體

不支援聯合查詢

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,並GetObject導致 Amazon S3 的成本提高,因此使用 時請考慮下列選項INSERT INTO

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

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

  • 避免完全使用 INSERT INTO 。相反地,將資料列累積到較大的檔案中,並直接上傳至 Amazon S3,Athena 可以在其中查詢這些資料。

尋找孤立檔案

如果 CTASINSERT INTO陳述式失敗,孤立的資料可以保留在資料位置,並且可能會在後續查詢中讀取。若要尋找孤立檔案以進行檢測或刪除,您可以使用 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')

下一個主題:

VALUES

上一個主題:

SELECT
隱私權網站條款Cookie 偏好設定
© 2025, Amazon Web Services, Inc.或其附屬公司。保留所有權利。