INSERT(外部表) - Amazon Redshift
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

INSERT(外部表)

将 SELECT 查询的结果插入(如 Amazon Glue、Amazon Lake Formation 或 Apache Hive 元存储的)外部目录上的现有外部表中。使用与用于 CREATE EXTERNAL SCHEMA 命令相同的 Amazon Identity and Access Management (IAM) 角色与外部目录和 Amazon S3 进行交互。

对于未分区的表,INSERT(外部表)命令根据指定的表属性和文件格式将数据写入在表中定义的 Amazon S3 位置。

对于已分区的表,INSERT(外部表)根据表中指定的分区键将数据写入 Amazon S3 位置。在 INSERT 操作完成后,它还会自动在外部目录中注册新分区。

您不能在事务数据块 (BEGIN ... END) 中运行 INSERT(外部表)。有关事务的更多信息,请参阅 可序列化的隔离

语法

INSERT INTO external_schema.table_name { select_statement }

参数

external_schema.table_name

现有外部架构和要插入到的目标外部表的名称。

select_statement

通过定义任何查询将一行或多行插入外部表的语句。查询生成的所有行都将根据表定义以文本或 Parquet 格式写入到 Amazon S3 。查询必须返回与外部表中的列数据类型兼容的列列表。但是,列名称不必匹配。

使用说明

SELECT 查询中的列数必须与数据列和分区列的总和相同。每个数据列的位置和数据类型必须与外部表的位置和数据类型相匹配。分区列的位置必须位于 SELECT 查询的末尾,与在 CREATE EXTERNAL TABLE 命令中定义它们的顺序相同。列名称不必匹配。

在某些情况下,您可能需要对 Amazon Glue 数据目录或 Hive 元存储运行 INSERT(外部表)命令。在 Amazon Glue 的情况下,用于创建外部架构的 IAM 角色必须对 Amazon S3 和 Amazon Glue 具有读取和写入权限。如果您使用 Amazon 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'。要更新这些值,请运行 ALTER TABLE SET TABLE PROPERTIES 命令。

  • 'numRows’ 表属性会在 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;