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

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

插入(外部表)

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

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

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

您无法在操作块中运行INSERT(外部表)(BEGIN...结束)。有关事务的更多信息,请参阅 可序列化的隔离

Syntax

INSERT INTO external_schema.table_name { select_statement }

Parameters

external_schema.table_name

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

select_statement

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

使用说明

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

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

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;