Snowflake 目录 SDK¶
Snowflake 目录 SDK 适用于 Apache Iceberg™ 1.2.0 或更高版本。
使用 Snowflake 目录 SDK,您可以使用第三方引擎(如 Apache Spark™ 或 Trino)查询 Iceberg 表。
支持的目录操作¶
该 SDK 支持使用以下命令在 Snowflake 中浏览 Iceberg 元数据:
SHOW NAMESPACES
USE NAMESPACE
SHOW TABLES
USE DATABASE
USE SCHEMA
该 SDK 目前仅支持读操作(SELECT 语句)。
安装和连接¶
安装 Snowflake 目录 SDK,下载 最新版本的 Iceberg 库 (https://iceberg.apache.org/releases/)。
在使用 Snowflake 目录 SDK 之前,您需要带有一个或多个 Iceberg 表的 Snowflake 数据库。要创建 Iceberg 表,请参阅 在 Snowflake 中创建 Apache Iceberg™ 表。
在建立连接并且 SDK 确认 Iceberg 元数据存在后,Snowflake 将使用与Iceberg 表关联的外部卷,访问 Parquet 数据。
使用 Spark 的示例¶
备注
要了解有关将 Trino 与 Snowflake 目录 SDK 一起使用的信息,请参阅 Trino 文档 (https://trino.io/docs/current/object-storage/metastores.html#iceberg-snowflake-catalog)。
要通过 SDK 读取表数据,请首先为 Spark 集群配置以下属性:
spark-shell --packages org.apache.iceberg:iceberg-spark-runtime-3.3_2.13:1.2.0,net.snowflake:snowflake-jdbc:3.13.28
# Configure a catalog named "snowflake_catalog" using the standard Iceberg SparkCatalog adapter
--conf spark.sql.catalog.snowflake_catalog=org.apache.iceberg.spark.SparkCatalog
# Specify the implementation of the named catalog to be Snowflake's Catalog implementation
--conf spark.sql.catalog.snowflake_catalog.catalog-impl=org.apache.iceberg.snowflake.SnowflakeCatalog
# Provide a Snowflake JDBC URI with which the Snowflake Catalog will perform low-level communication with Snowflake services
--conf spark.sql.catalog.snowflake_catalog.uri='jdbc:snowflake://<account_identifier>.snowflakecomputing.cn'
# Configure the Snowflake user on whose behalf to perform Iceberg metadata lookups
--conf spark.sql.catalog.snowflake_catalog.jdbc.user=<user_name>
# Provide the user password. To configure the credentials, you can provide either password or private_key_file.
--conf spark.sql.catalog.snowflake_catalog.jdbc.password=<password>
# Configure the private_key_file to use when connecting to Snowflake services; additional connection options can be found at https://docs.snowflake.com/en/user-guide/jdbc-configure.html
--conf spark.sql.catalog.snowflake_catalog.jdbc.private_key_file=<location of the private key>
备注
您可利用如下语法,在配置中使用 Snowflake 支持的任何 JDBC 驱动程序连接参数:--conf spark.sql.catalog.snowflake_catalog.jdbc.property-name=property-value
在配置 Spark 集群后,您可以检查有哪些表可供查询。例如:
spark.sessionState.catalogManager.setCurrentCatalog("snowflake_catalog");
spark.sql("SHOW NAMESPACES").show()
spark.sql("SHOW NAMESPACES IN my_database").show()
spark.sql("USE my_database.my_schema").show()
spark.sql("SHOW TABLES").show()
随后即可选择要查询的表。
spark.sql("SELECT * FROM my_database.my_schema.my_table WHERE ").show()
可通过 Python 和 Scala 等语言使用 DataFrame
结构来查询数据。
df = spark.table("my_database.my_schema.my_table")
df.show()
备注
如果在运行查询时收到矢量化读取错误,可以通过配置以下项来禁用会话的矢量化读取:spark.sql.iceberg.vectorization.enabled=false
。要继续使用矢量化读取,您可以设置 STORAGE_SERIALIZATION_POLICY 参数。
查询缓存¶
在您发出查询时,Snowflake 会在特定时间范围内(默认为 90 秒)缓存结果。您可能会遇到延迟,不过持续时间不会超过此时间范围。如果出于比较的目的,您打算通过编程方式访问数据,则可以将 spark.sql.catalog..cache-enabled
属性设置为 false
以禁用缓存。
如果应用程序的设计可以接受特定的延迟时长,则可以使用以下属性来指定延迟时间段:spark.sql.catalog..cache.expiration-interval-ms
。
限制¶
以下限制适用于 Snowflake 目录 SDK,但有可能随时发生变化:
该 SDK 目前仅支持读操作(SELECT 语句)。
仅支持通过 Apache Spark 和 Trino 读取 Iceberg 表。
不能使用 SDK 访问非 Iceberg Snowflake 表。