INSERT INTO - Amazon Athena
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

INSERT INTO

基于在源表上运行的 SELECT 查询语句或作为语句一部分提供的一组 VALUES,将新行插入到目标表中。When the source table is based on underlying data in one format, such as CSV or JSON, and the destination table is based on another format, such as Parquet or ORC, you can use INSERT INTO queries to transform selected data into the destination table's format.

注意事项和限制

在 Athena 中使用 INSERT 查询时注意以下事项。

重要

When running an INSERT query on a table with underlying data that is encrypted in Amazon S3, the output files that the INSERT query writes are not encrypted by default. 如果要插入具有加密数据的表中,建议您对 INSERT 查询结果进行加密。

有关使用控制台加密查询结果的更多信息,请参阅 加密存储在 Amazon S3 中的查询结果。To enable encryption using the AWS CLI or Athena API, use the EncryptionConfiguration properties of the StartQueryExecution action to specify Amazon S3 encryption options according to your requirements.

Supported Formats and SerDes

You can run an INSERT query on tables created from data with the following formats and SerDes.

数据格式 SerDe

Avro

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

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

注意

支持 CSV、TSV 和自定义分隔文件。

不支持分桶表

分桶表上不支持 INSERT INTO。有关更多信息,请参阅分桶与分区

Partitioning

Consider the points in this section when using parititioning with INSERT INTO or CREATE TABLE AS SELECT queries.

Limits

INSERT INTO 语句支持向目标表写入最多 100 个分区。如果您在包含超过 100 个分区的表上运行 SELECT 子句,则查询将失败,除非 SELECT 查询限制为 100 个或更少的分区。

有关绕过此限制的信息,请参阅使用 CTAS 和 INSERT INTO 创建带 100 多个分区的表

Column Ordering

INSERT INTO or CREATE TABLE AS SELECT statements expect the partitioned column to be the last column in the list of projected columns in a SELECT statement.

If the source table is non-partitioned, or partitioned on different columns compared to the destination table, queries like INSERT INTO destination_table SELECT * FROM source_table consider the values in the last column of the source table to be values for a partition column in the destination table. Keep this in mind when trying to create a partitioned table from a non-partitioned table.

Resources

For more information about using INSERT INTO with partitioning, see the following resources.

写入到 Amazon S3 的文件

作为 INSERT 命令的结果,Athena 将文件写入 Amazon S3 中的源数据位置。每个 INSERT 操作都会创建一个新文件,而不是附加到现有文件。文件位置取决于表和 SELECT 查询的结构(如果存在)。Athena 为每个 INSERT 查询生成一个数据清单文件。清单跟踪查询写入的文件。它在 Amazon S3 中保存到 Athena 查询结果位置。有关更多信息,请参阅识别查询输出文件

查找孤立文件

如果 CTASINSERT INTO 语句失败,则可能会在数据位置留下孤立数据。由于 Athena 不会从存储桶中删除任何数据(甚至是部分数据),您也许能够在后续查询中读取此部分数据。若要查找孤立文件以执行检查或删除操作,您可以使用 Athena 提供的数据清单文件跟踪要写入的文件列表。有关更多信息,请参阅 识别查询输出文件DataManifestLocation

INSERT INTO...SELECT

Specifies the query to run on one table, source_table, which determines rows to insert into a second table, destination_table. If the SELECT query specifies columns in the source_table, the columns must precisely match those in the destination_table.

有关 SELECT 查询的更多信息,请参阅 SELECT

Synopsis

INSERT INTO destination_table SELECT select_query FROM source_table_or_view

Examples

选择 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 查询创建的文件,请检查数据清单文件。有关更多信息,请参阅使用查询结果、输出文件和查询历史记录

Synopsis

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

Examples

In the following examples, the cities table has three columns: id, city, state, state_motto. The id column is type INT and all other columns are type 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')