CREATE ICEBERG TABLE(使用 AWS Glue 作为 Iceberg 目录)

使用在 AWS Glue Data Catalog 中注册的 Iceberg 表,在当前/指定架构中创建或替换 Apache Iceberg™ 表。这种类型的 Iceberg 表需要 目录集成 才能将 Snowflake 连接到 AWS Glue。

本主题将 Iceberg 表简称为“表”(指定 Iceberg 表 的位置除外)以避免混淆。

备注

在创建表之前,必须创建存储 Iceberg 元数据和数据文件的 外部卷。有关说明,请参阅 配置外部卷

您还需要为表配置目录集成。要了解更多信息,请参阅 为 AWS Glue 配置目录集成

另请参阅:

ALTER ICEBERG TABLEDROP ICEBERG TABLESHOW ICEBERG TABLESDESCRIBE ICEBERG TABLEUNDROP ICEBERG TABLE

语法

CREATE [ OR REPLACE ] ICEBERG TABLE [ IF NOT EXISTS ] <table_name>
  [ EXTERNAL_VOLUME = '<external_volume_name>' ]
  [ CATALOG = '<catalog_integration_name>' ]
  CATALOG_TABLE_NAME = '<catalog_table_name>'
  [ CATALOG_NAMESPACE = '<catalog_namespace>' ]
  [ REPLACE_INVALID_CHARACTERS = { TRUE | FALSE } ]
  [ AUTO_REFRESH = { TRUE | FALSE } ]
  [ COMMENT = '<string_literal>' ]
  [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
Copy

必填参数

table_name

指定表的标识符(名称);在创建表的架构中必须是唯一的。

此外,标识符必须以字母字符开头,且不能包含空格或特殊字符,除非整个标识符字符串放在双引号内(例如,"My object")。放在双引号内的标识符也区分大小写。

有关更多信息,请参阅 标识符要求

CATALOG_TABLE_NAME = 'catalog_table_name'

指定 AWS Glue Data Catalog 可识别的表名称。有关在创建 Iceberg 表时使用 CATALOG_TABLE_NAME 的示例,请参阅 `示例`_(本主题内容)。

创建表后,该参数无法更改。

可选参数

EXTERNAL_VOLUME = 'external_volume_name'

指定外部卷的标识符(名称),Iceberg 表会以 Parquet 格式将自身的元数据文件和数据存储在里面。Iceberg 元数据和清单文件存储表架构、分区、快照和其他元数据。

如果未指定此参数,则 Iceberg 表将默认使用架构、数据库或账户的外部卷。架构优先于数据库,数据库优先于账户。

CATALOG = 'catalog_integration_name'

指定此表的目录集成的标识符(名称)。您必须指定已为 AWS Glue 配置的目录集成。有关信息,请参阅 为 AWS Glue 配置目录集成

如果未指定,则默认将 Iceberg 表视为架构、数据库或账户的目录集成。架构优先于数据库,数据库优先于账户。

CATALOG_NAMESPACE = 'catalog_namespace'

可选择指定 AWS Glue 数据目录源的命名空间(例如,my_glue_database),并替换通过目录集成指定的默认目录命名空间。通过在表级别指定命名空间,您可以使用 AWS Glue 的单个目录集成,跨不同数据库创建 Iceberg 表。

如果未指定,则该表将使用与目录集成关联的默认目录命名空间。

REPLACE_INVALID_CHARACTERS = { TRUE | FALSE }

指定在查询结果中是否使用 Unicode 替换字符 (�) 替换无效的 UTF-8 字符。您只能为使用外部 Tables 目录的表设置此参数。

  • TRUE 会将无效的 UTF-8 字符替换为 Unicode 替换字符。

  • FALSE 保留无效的 UTF-8 字符不变。如果在 Parquet 数据文件中遇到无效的 UTF-8 字符,Snowflake 会返回用户错误消息。

如果未指定,则 Iceberg 表将默认使用架构、数据库或账户的参数值。架构优先于数据库,数据库优先于账户。

默认:FALSE

AUTO_REFRESH = { TRUE | FALSE }

指定在使用 自动刷新 时,Snowflake 是否应自动轮询与表关联的外部 Iceberg 目录以获取元数据更新。如果没有为目录集成上的 REFRESH_INTERVAL_SECONDS 参数指定值,则 Snowflake 将使用 30 秒作为默认刷新间隔。

默认:FALSE

COMMENT = 'string_literal'

指定表的注释。

默认:无值

TAG ( tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ] )

指定 标签 名称和标签字符串值。

标签值始终为字符串,标签值的最大字符数为 256。

有关在语句中指定标签的信息,请参阅 对象和列的标签配额

访问控制要求

用于执行此 SQL 命令的 角色 必须至少具有以下 权限

权限

对象

备注

CREATE ICEBERG TABLE

架构

CREATE EXTERNAL VOLUME

账户

需要创建新的外部卷。

USAGE

外部卷

需要引用现有的外部卷。

CREATE INTEGRATION

账户

需要创建新的目录集成。

USAGE

目录集成

需要引用现有目录集成。

请注意,对架构中的对象进行操作还需要对父数据库和架构具有 USAGE 权限。

有关创建具有指定权限集的自定义角色的说明,请参阅 创建自定义角色

有关对 安全对象 执行 SQL 操作的相应角色和权限授予的一般信息,请参阅 访问控制概述

使用说明

  • 运行此命令的注意事项:

    • 如果您使用双引号标识符创建了外部卷或目录集成,则必须 :emph:` 完全 ` 按照在 CREATE ICEBERG TABLE 语句中创建的标识符(包括双引号)来指定标识符。未包含引号可能会导致 Object does not exist 错误(或类似类型的错误)。

      若要查看示例,请参阅 ` 示例 `_ (本主题内容)部分。

  • 创建表的注意事项:

    • 架构不能包含同名的表和/或视图。创建表时:

      • 如果架构中已存在同名视图,则会返回错误,并且不会创建表。

      • 如果架构中已存在同名的表,则会返回错误,并且不会创建表,除非命令中包含可选的 OR REPLACE 关键字。

    • CREATE OR REPLACE <object> 语句是原子的。也就是说,当对象被替换时,旧对象将被删除,新对象将在单个事务中创建。

      这意味着与 CREATE OR REPLACE ICEBERG TABLE 操作并行的任何查询都使用旧的或新的表版本。

    • 保留关键字 类似,ANSI 保留函数名称(CURRENT_DATECURRENT_TIMESTAMP 等)不能用作列名。

    • 重新创建表(使用可选 OR REPLACE 关键字)会删除其历史记录,这会使表上的任何流都过时。过时的流是不可读的。

  • 关于元数据:

    注意

    客户应确保在使用 Snowflake 服务时,不会将个人数据(用户对象除外)、敏感数据、出口管制数据或其他受监管数据作为元数据输入。有关更多信息,请参阅 Snowflake 中的元数据字段

示例

创建以 AWS Glue 作为目录的 Iceberg 表

此示例创建一个使用 AWS Glue 数据目录的 Iceberg 表。语句使用可选的 CATALOG_NAMESPACE 参数以替换默认目录命名空间,并为表设置目录命名空间,

CREATE ICEBERG TABLE glue_iceberg_table
  EXTERNAL_VOLUME='glue_catalog_volume'
  CATALOG='glue_catalog_integration'
  CATALOG_TABLE_NAME='my_glue_catalog_table'
  CATALOG_NAMESPACE='icebergcatalogdb2';
Copy

使用带双引号的标识符指定外部卷或目录集成

此示例创建一个具有外部卷和目录集成的 Iceberg 表,表的标识符中包含双引号。放在双引号内的标识符区分大小写,并且通常包含特殊字符。

标识符 "glue_volume_1""glue_catalog_integration_1" 指定为与创建时完全相同(包括双引号)。未包含引号可能会导致 Object does not exist 错误(或类似类型的错误)。

要了解更多信息,请参阅 加双引号的标识符

CREATE OR REPLACE ICEBERG TABLE itable_with_quoted_catalog
  EXTERNAL_VOLUME = '"glue_volume_1"'
  CATALOG = '"glue_catalog_integration_1"'
  CATALOG_TABLE_NAME='my_glue_catalog_table'
  CATALOG_NAMESPACE='icebergcatalogdb2';
Copy
语言: 中文