Iceberg Catalog配置
创建Catalog
Catalog用于加载、创建和管理Iceberg表,具体通过配置spark.sql.catalog的相关属性来实现。
配置Catalog
通过属性“spark.sql.catalog.catalog-name”添加具体的实现类来配置Catalog。支持以下两种类:
- org.apache.iceberg.spark.SparkCatalog
org.apache.iceberg.spark.SparkCatalog由Iceberg全权管理,主要支持Iceberg表,使用Hive Metastore来存储这些元数据。
SET spark.sql.catalog.spark_catalog = org.apache.iceberg.spark.SparkCatalog;
- org.apache.iceberg.spark.SparkSessionCatalog
org.apache.iceberg.spark.SparkSessionCatalog由Spark的内置Catalog管理,支持多种表格式。识别到Iceberg表后委托给底层的Iceberg API;对于非Iceberg表(如Parquet、Hive),仍由Spark原生的元数据管理机制或Hive Metastore管理。
SET spark.sql.catalog.spark_catalog = org.apache.iceberg.spark.SparkSessionCatalog;
常用的Catalog属性请参见下表:
| 参数 | 说明 |
|---|---|
| spark.sql.catalog.catalog-name.type | 底层使用的Iceberg Catalog实现方式,对应Hive Catalog,即值为“hive”。如果使用自定义目录,该参数值可为空。 hive:基于Hive Metastore的Catalog,用于集成Hive的元数据管理系统。设置为该类型,Spark可以直接访问Hive Metastore中存储的数据库、表元数据(如Schema、分区信息等),支持与Hive表的互通(包括读写Hive管理表、外部表)。 |
| spark.sql.catalog.catalog-name.catalog-impl | 自定义的Iceberg Catalog实现类。如果“spark.sql.catalog.catalog-name.type”为空,必须设置该参数值。 |
| spark.sql.catalog.catalog-name.io-impl | 自定义的文件IO实现类。 |
| spark.sql.catalog.catalog-name.metrics-reporter-impl | 自定义的指标报告器实现类。 |
| spark.sql.catalog.catalog-name.default-namespace | 目录的默认命名空间,默认值为“default”。 |
| spark.sql.catalog.catalog-name.uri | 对于Hive类型的目录,值为Hive元数据存储的URL。 |
| spark.sql.catalog.catalog-name.warehouse | 仓库目录的基础路径,为HDFS或OBS路径。 |
| spark.sql.catalog.catalog-name.cache-enabled | 是否启用目录缓存,默认值为“true”。 |
| spark.sql.catalog.catalog-name.cache.expiration-interval-ms | 缓存的目录条目过期时间,仅当“cache-enabled”为“true”时有效。默认值为30000(30秒),其中:
|
| spark.sql.catalog.catalog-name.table-default.propertyKey | 表属性propertyKey的默认值,使用该目录创建表时,如果没特别指定,就使用默认值。 |
| spark.sql.catalog.catalog-name.table-override.propertyKey | 表属性propertyKey的强制值,用户不能修改。 |
| spark.sql.catalog.catalog-name.use-nullable-query-schema | 用CTAS和RTAS创建表时,是否保留字段的可空性,适用于Spark 3.5及之后版本。
|
使用Catalog
在启动spark-sql时指定使用的Catalog,例如:
spark-sql \
--conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \
--conf spark.sql.catalog.{自定义catalog名称}=org.apache.iceberg.spark.SparkCatalog \
--conf spark.sql.catalog.{自定义catalog名称}.type=hive \
--conf spark.sql.storeAssignmentPolicy=ANSI Spark会自动记录当前使用的Catalog与命名空间,若目标表处于当前Catalog及命名空间下,可省略Catalog名与命名空间前缀。
切换数据库:
USE prod.db;
查询数据(表sample需已存在):
SELECT * FROM sample;