将 Snowflake 管理的表与 Snowflake Open Catalog 同步¶
要使用 Apache Spark™ 等第三方引擎查询 Snowflake 托管的 Apache Iceberg™ 表,可以将表与 Snowflake Open Catalog 同步。
本主题介绍如何使用 Snowflake 中的目录集成和 Open Catalog 中的外部目录将 Snowflake 管理的 Iceberg 表与 Snowflake Open Catalog 同步。
第 1 步:创建外部暂存区¶
如果您还没有,请先在 Snowflake 中创建一个外部卷,该卷提供对要存储表数据和元数据的云存储位置的访问权限。
完成云存储服务的说明:
第 2 步:配置 Open Catalog 资源¶
接下来,完成本节中的步骤,在 Open Catalog 账户中创建外部目录和服务连接。
按照 创建目录 中的说明,在 Open Catalog 账户中创建外部目录。确保为外部目录配置了以下设置:
External 切换已启用。
Default base location 与
STORAGE_BASE_URL
对于您在 第 1 步:创建外部暂存区 中创建的外部卷匹配。
Open Catalog 将 Snowflake 管理的表同步到此外部目录。
如果您还没有 Snowflake 的服务连接,请按照 配置服务连接 中的说明在您的 Open Catalog 账户中为 Snowflake 引擎创建连接。
为外部目录配置目录角色,该角色具有允许访问外部目录的权限。有关说明,请参阅 向目录授予权限。
目录角色必须对目录具有以下特权:
TABLE_CREATE
TABLE_WRITE_PROPERTIES
TABLE_DROP
NAMESPACE_CREATE
NAMESPACE_DROP
您可以将这些特权中的每一个授予目录角色,也可以授予 CATALOG_MANAGE_CONTENT 特权,其中包括这些权限。有关更多信息,请参阅 Snowflake Open Catalog 的目录特权。
将目录角色附加到服务连接的主体角色。这允许服务连接访问目录。有关说明,请参阅 向主体角色授予目录角色。
第 3 步:为 Open Catalog 创建目录集成¶
通过 CREATE CATALOG INTEGRATION (Snowflake Open Catalog) 命令为 Open Catalog 创建目录集成。对于 WAREHOUSE,指定您在 Open Catalog 账户中配置的外部目录的名称。
要解决创建目录集成时出现的问题,请参阅 您无法为 Open Catalog 创建目录集成。
CREATE OR REPLACE CATALOG INTEGRATION my_open_catalog_int
CATALOG_SOURCE = POLARIS
TABLE_FORMAT = ICEBERG
CATALOG_NAMESPACE = 'myOpenCatalogNamespace'
REST_CONFIG = (
CATALOG_URI = 'https://<orgname>.<my-snowflake-open-catalog-account-name>.snowflakecomputing.cn/polaris/api/catalog'
WAREHOUSE = 'myOpenCatalogExternalCatalogName'
)
REST_AUTHENTICATION = (
TYPE = OAUTH
OAUTH_CLIENT_ID = 'myClientId'
OAUTH_CLIENT_SECRET = 'myClientSecret'
OAUTH_ALLOWED_SCOPES = ('PRINCIPAL_ROLE:ALL')
)
ENABLED = TRUE;
备注
您可以使用此目录集成来同步一个或多个 Snowflake 管理的表。
第 4 步:创建 Snowflake 管理的表¶
使用 CREATE ICEBERG TABLE(使用 Snowflake 作为 Iceberg 目录) 命令创建 Snowflake 管理的 Iceberg 表。
重要
要确保在 Open Catalog 中对表正确实施特权,请确保在创建表之前满足特定条件。这些条件与目录的目录结构层次结构有关。有关这些条件以及如何满足这些条件的说明,请参阅 Snowflake Open Catalog 文档中 组织目录内容 中的说明。
对于 CATALOG_SYNC 参数,请为 Open Catalog 目录集成指定名称。
要排查创建 Snowflake 管理的表的问题,请参阅 您无法创建 Snowflake 管理的表。
CREATE OR REPLACE ICEBERG TABLE my_managed_iceberg_table (col1 INT)
CATALOG = 'SNOWFLAKE'
EXTERNAL_VOLUME = 'my_external_volume'
BASE_LOCATION = 'my_managed_iceberg_table'
CATALOG_SYNC = 'my_open_catalog_int';
当您在 Snowflake 中修改表时,更改会自动与 Open Catalog 账户中的外部目录同步。其他引擎(如 Apache Spark™)可以通过连接到 Open Catalog 查询表。