CREATE ICEBERG TABLE(Iceberg REST 目录)¶
在当前/指定架构中为 Iceberg REST 目录创建或替换 Apache Iceberg™ 表。
在以下场景中使用此命令:
您想要使用符合开源 Apache Iceberg REST OpenAPI 规范 (https://github.com/apache/iceberg/blob/main/open-api/rest-catalog-open-api.yaml) 的远程 Iceberg 目录。
您想要查询 Snowflake Open Catalog 中的表。有关更多信息,请参阅 使用 Snowflake 查询 Snowflake Open Catalog 中的表。
备注
在创建表之前,必须创建存储 Iceberg 元数据和数据文件的 外部卷。有关说明,请参阅 配置外部卷。
您还需要为表配置目录集成。有关更多信息,请参阅 为|iceberg-tm| REST 目录配置目录集成 或 为 Snowflake Open Catalog 配置目录集成。
- 另请参阅:
ALTER ICEBERG TABLE、DROP ICEBERG TABLE、SHOW ICEBERG TABLES、DESCRIBE ICEBERG TABLE、UNDROP ICEBERG TABLE
语法¶
CREATE [ OR REPLACE ] ICEBERG TABLE [ IF NOT EXISTS ] <table_name>
[ EXTERNAL_VOLUME = '<external_volume_name>' ]
[ CATALOG = '<catalog_integration_name>' ]
CATALOG_TABLE_NAME = '<rest_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>' , ... ] ) ]
必填参数¶
table_name
指定 Snowflake 中的表的标识符(名称);对于在其中创建表的架构而言,必须是唯一的。
此外,标识符必须以字母字符开头,且不能包含空格或特殊字符,除非整个标识符字符串放在双引号内(例如,
"My object"
)。放在双引号内的标识符也区分大小写。有关更多信息,请参阅 标识符要求。
备注
要检索远程目录中的表或命名空间列表,可以使用以下函数:
CATALOG_TABLE_NAME = 'rest_catalog_table_name'
指定外部目录可识别的表名称。创建表后,此参数无法更改。
备注
请勿使用表名称 (
mynamespace.mytable
) 指定命名空间。若要为此表指定命名空间,并替换对目录集成设置的默认命名空间,请使用 CATALOG_NAMESPACE 参数。
可选参数¶
EXTERNAL_VOLUME = 'external_volume_name'
指定外部卷的标识符(名称),Iceberg 表会以 Parquet 格式将自身的元数据文件和数据存储在里面。Iceberg 元数据和清单文件存储表架构、分区、快照和其他元数据。
如果未指定此参数,则 Iceberg 表将默认使用架构、数据库或账户的外部卷。架构优先于数据库,数据库优先于账户。
CATALOG = 'catalog_integration_name'
指定此表的目录集成的标识符(名称)。
如果未指定此参数,则 Iceberg 表将默认使用架构、数据库或账户的目录集成。架构优先于数据库,数据库优先于账户。
CATALOG_NAMESPACE = 'catalog_namespace'
可选择指定 REST 目录源的命名空间(例如,
my_database
),并替换通过目录集成指定的默认目录命名空间。通过在表级别指定命名空间,您可以使用单个 REST 目录集成,跨不同数据库创建 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'
指定表的注释。
默认:无值
访问控制要求¶
权限 |
对象 |
备注 |
---|---|---|
CREATE ICEBERG TABLE |
架构 |
|
CREATE EXTERNAL VOLUME |
账户 |
需要创建新的外部卷。 |
USAGE |
外部卷 |
需要引用现有的外部卷。 |
CREATE INTEGRATION |
账户 |
需要创建新的目录集成。 |
USAGE |
目录集成 |
需要引用现有目录集成。 |
请注意,对架构中的对象进行操作还需要对父数据库和架构具有 USAGE 权限。
有关创建具有指定权限集的自定义角色的说明,请参阅 创建自定义角色。
使用说明¶
如果您使用双引号标识符创建了外部卷或目录集成,则必须 :emph:` 完全 ` 按照在 CREATE ICEBERG TABLE 语句中创建的标识符(包括双引号)来指定标识符。未包含引号可能会导致
Object does not exist
错误(或类似类型的错误)。创建表的注意事项:
架构不能包含同名的表和/或视图。创建表时:
如果架构中已存在同名视图,则会返回错误,并且不会创建表。
如果架构中已存在同名的表,则会返回错误,并且不会创建表,除非命令中包含可选的
OR REPLACE
关键字。
CREATE OR REPLACE <object> 语句是原子的。也就是说,当对象被替换时,旧对象将被删除,新对象将在单个事务中创建。
这意味着与 CREATE OR REPLACE ICEBERG TABLE 操作并行的任何查询都使用旧的或新的表版本。
与 保留关键字 类似,ANSI 保留函数名称(CURRENT_DATE、CURRENT_TIMESTAMP 等)不能用作列名。
重新创建表(使用可选
OR REPLACE
关键字)会删除其历史记录,这会使表上的任何流都过时。过时的流是不可读的。
关于元数据:
注意
客户应确保在使用 Snowflake 服务时,不会将个人数据(用户对象除外)、敏感数据、出口管制数据或其他受监管数据作为元数据输入。有关更多信息,请参阅 Snowflake 中的元数据字段。
示例¶
创建使用远程 Iceberg REST 目录的 Iceberg 表¶
CREATE OR REPLACE ICEBERG TABLE my_iceberg_table
EXTERNAL_VOLUME = 'my_external_volume'
CATALOG = 'my_rest_catalog_integration'
CATALOG_TABLE_NAME = 'my_remote_table';
创建 Iceberg 表来查询 Snowflake Open Catalog 中的表¶
此示例创建了一个 Iceberg 表,可用于 使用 Snowflake 查询 Snowflake Open Catalog 中的表。
CREATE ICEBERG TABLE open_catalog_iceberg_table
EXTERNAL_VOLUME = 'my_external_volume'
CATALOG = 'open_catalog_int'
CATALOG_TABLE_NAME = 'my_open_catalog_table';