创建表
引擎参数
S3、AzureBlobStorage、HDFS 和 File 表引擎中的参数说明一致。
format 表示 Iceberg 表中数据文件的格式。
对于 IcebergS3,可使用可选参数 extra_credentials 传递 role_arn,以便在 ClickHouse Cloud 中进行基于角色的访问。有关配置步骤,请参阅 安全访问 S3。
可以使用 命名集合 指定引擎参数。
示例
别名
Iceberg 是 IcebergS3 的别名。
数据类型
基本类型
| Iceberg 类型 | ClickHouse 类型 | 说明 |
|---|---|---|
boolean | Bool | |
int | Int32 | |
long, bigint | Int64 | |
float | Float32 | |
double | Float64 | |
date | Date32 | |
time | Int64 | 自午夜起的微秒数 |
timestamp | DateTime64(6) | 微秒,无时区 |
timestamptz | DateTime64(6, 'UTC') | 微秒,UTC 时区 |
timestamp_ns | DateTime64(9) | 纳秒,无时区 (仅适用于 Iceberg v3 及以上版本) |
timestamptz_ns | DateTime64(9, 'UTC') | 纳秒,UTC 时区 (仅适用于 Iceberg v3 及以上版本) |
string, binary | String | |
uuid | UUID | |
fixed(N) | FixedString(N) | |
decimal(P, S) | Decimal(P, S) |
复合类型
| Iceberg 类型 | ClickHouse 类型 |
|---|---|
list | Array |
map | Map |
struct | Tuple |
Schema 演进
- int -> long
- float -> double
- decimal(P, S) -> decimal(P’, S) where P’ > P.
分区裁剪
use_iceberg_partition_pruning = 1。有关 Iceberg 分区裁剪的更多信息,请参阅 https://iceberg.apache.org/spec/#partitioning
时间旅行
包含已删除行的表的处理
- 删除向量 (在 v3 中引入)
基本用法
iceberg_timestamp_ms 和 iceberg_snapshot_id 参数。
重要注意事项
-
快照通常会在以下情况下创建:
- 向表中写入新数据时
- 执行某种数据合并整理时
- schema 变更通常不会创建快照——这会在对经历过 schema 演进的表使用时间旅行时带来一些重要特性。
示例场景
场景 1:没有新快照的 schema 变更
- 在 ts1 和 ts2 时:仅显示最初的两列
- 在 ts3 时:显示全部三列,其中第一行的 price 为 NULL
场景 2:历史 schema 与当前 schema 的差异
ALTER TABLE 不会创建新的 快照;对于当前表,Spark 获取 schema_id 的值时,取自最新的元数据文件,而不是某个 快照。
场景 3:历史 schema 与当前 schema 的差异
元数据文件解析
Iceberg 表引擎时,系统需要找到描述 Iceberg 表结构的正确 metadata.json 文件。下面介绍这一解析过程的工作原理:
候选文件搜索
- 直接指定路径:
- 如果设置了
iceberg_metadata_file_path,系统会将其与 Iceberg 表目录路径拼接,使用这个精确路径。 - 提供此设置后,其他所有解析设置都会被忽略。
- 表 UUID 匹配:
- 如果指定了
iceberg_metadata_table_uuid,系统将:- 只检查
metadata目录中的.metadata.json文件 - 筛选出包含
table-uuid字段且与指定 UUID 匹配 (不区分大小写) 的文件
- 只检查
- 默认搜索:
- 如果上述两个设置都未提供,则
metadata目录中的所有.metadata.json文件都会作为候选文件
选择最新的文件
-
如果启用了
iceberg_recent_metadata_file_by_last_updated_ms_field:- 选择
last-updated-ms值最大的文件
- 选择
-
否则:
- 选择版本号最大的文件
- (在格式为
V.metadata.json或V-uuid.metadata.json的文件名中,版本号显示为V)
Iceberg 表引擎会直接将存储在 S3 中的文件识别为 Iceberg 表,因此理解这些解析规则非常重要。
数据缓存
Iceberg 表引擎和表函数支持数据缓存,与 S3、AzureBlobStorage 和 HDFS 存储相同。请参见此处。
元数据缓存
Iceberg 表引擎和表函数支持元数据缓存,可缓存 manifest 文件、manifest 列表和 metadata json 的相关信息。缓存存储在内存中。此功能由设置 use_iceberg_metadata_files_cache 控制,默认启用。
异步元数据预取
Iceberg 表时,可通过设置 iceberg_metadata_async_prefetch_period_ms 启用异步元数据预取。如果将其设为 0 (默认值) ,或未启用元数据缓存,则会禁用异步预取。
要启用此功能,需要指定一个非零的毫秒值,表示两次预取周期之间的时间间隔。
启用后,服务器会在后台周期性执行一项操作,列出远程 目录 并检测新的元数据版本。随后会对其进行解析,并递归遍历快照,拉取活动的 manifest 列表和 manifest 文件。
已存在于元数据缓存中的文件不会被重复下载。每个预取周期结束时,最新的元数据快照都会存放在元数据缓存中。
iceberg_metadata_staleness_ms 指定为查询参数或会话参数。默认情况下 (0,即未指定) ,在每个查询的上下文中,服务器都会从远程 目录 拉取最新元数据。
通过指定可容忍的元数据过期程度,服务器便可在不调用远程 目录 的情况下使用已缓存的元数据 快照 版本。如果缓存中存在元数据版本,且其下载时间处于给定的过期窗口内,则会使用该版本来处理查询。
否则,将从远程 目录 拉取最新版本。
ICEBERG_SCEDULE_POOL 中运行,这是一个服务器端线程池,用于对活动 Iceberg 表执行后台操作。该线程池的大小由服务器配置参数 iceberg_background_schedule_pool_size 控制 (默认值为 10) 。
注意:目前预期是,如果启用了异步预取,元数据缓存的大小应足以完整容纳所有活动表的最新元数据快照。