本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
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
陳述式,則請參閱 更新冰山表數據 的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
。如需詳細資訊,請參閱 使用分割和分區設定。
不支援聯合查詢
INSERT INTO
不支援聯合查詢。嘗試執行這項操作可能會產生錯誤訊息:外部目錄目前不支援此操作
。如需聯合查詢的詳細資訊,請參閱使用 Amazon Athena 聯合查詢。
分割
搭配 INSERT
INTO
或 CREATE TABLE AS SELECT
查詢使用分割區時,請將本章節的幾個重點納入考量。
限制
INSERT INTO
陳述式支援最多將 100 個分割區寫入目標資料表。如果您在分割區超過 100 個的資料表上執行 SELECT
子句,除非 SELECT
查詢限制在 100 個分割區或更少,否則查詢會失敗。
如需解決此限制的相關資訊,請參閱使用CTAS並INSERTINTO解決 100 個分區限制。
資料欄排序
INSERT INTO
或 CREATE TABLE AS SELECT
陳述式會預期分割的資料欄為 SELECT
陳述式中投影資料欄清單的最後一個資料欄。
如果來源資料表未經分割,或與目標資料表相比在不同的資料欄上分割,則如 INSERT INTO
的查詢會將來源資料表中的最後一個資料欄的值,認定為目標資料表中的分割區資料欄的值。嘗試從未分割的資料表建立分割的資料表時,請注意以上提醒。destination_table
SELECT * FROM
source_table
資源
如需有關搭配分割使用 INSERT INTO
的詳細資料,請參閱以下資源。
-
如需將分割的資料插入分割的資料表,請參閱使用CTAS並INSERTINTO解決 100 個分區限制。
-
如需將未分割的資料插入分割的資料表,請參閱使用CTAS和用INSERTINTO於ETL和數據分析。
寫入 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 就能查詢這些資料列。
尋找孤立檔案
如果CTAS
或INSERT 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-01
到 2019-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
資料表中 city
與 state
欄內的值,並將其插入 cities_usa
資料表中的 city
和 state
欄:
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,...)][,
...]
範例
在下列範例中,城市資料表有三個資料欄:id
、city
、state
、state_motto
。id
資料欄的類型是 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')