语法
参数
s3、azureBlobStorage、HDFS 和 file 中对应参数的说明一致。
format 表示 Iceberg 表中数据文件的格式。
对于 icebergS3,可使用可选参数 extra_credentials 传入 role_arn,以便在 ClickHouse Cloud 中实现基于角色的访问。有关配置步骤,请参见 安全访问 S3。
返回值
示例
定义命名集合
使用数据目录
IcebergS3 引擎创建表,并提供必要的设置。
例如,结合 MinIO 存储使用 REST Catalog:
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
时间旅行
处理含已删除行的表
基本用法
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 表函数时,系统需要找到正确的 metadata.json 文件,该文件用于描述 Iceberg 表的结构。下面介绍这一定位过程的工作方式:
候选项搜索 (按优先顺序)
- 直接指定路径:
*如果设置了
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 表引擎和表函数支持元数据缓存,可存储 manifest 文件、manifest 列表以及元数据 json 的相关信息。该缓存存储在内存中。此功能由设置 use_iceberg_metadata_files_cache 控制,且默认启用。
别名
iceberg 现为 icebergS3 的别名。
虚拟列
_path— 文件路径。类型:LowCardinality(String)。_file— 文件名。类型:LowCardinality(String)。_size— 文件大小 (单位:字节) 。类型:Nullable(UInt64)。如果文件大小未知,则值为NULL。_time— 文件的最后修改时间。类型:Nullable(DateTime)。如果时间未知,则值为NULL。_etag— 文件的 etag。类型:LowCardinality(String)。如果 etag 未知,则值为NULL。
写入 Iceberg 表
创建表
示例
iceberg_use_version_hint 设置。
如果要压缩 metadata.json 文件,请在 iceberg_metadata_compression_method 设置中指定编解码器名称。
INSERT
示例
DELETE
示例
Schema 演进
示例
合并整理
过期快照
expire_snapshots 命令会删除旧快照,并清理不再被任何保留快照引用的数据文件。
语法:
min-snapshots-to-keep、max-snapshot-age-ms 以及针对各 ref 的覆盖配置) 。指定 snapshot_ids 时,会绕过保留策略,并且只会将列出的快照纳入过期处理范围。
参数:
'timestamp'(位置参数) 或expire_before = 'timestamp'— 一个日期时间字符串 (例如'2024-06-01 00:00:00') ,按服务器时区解释。它相当于一个安全阀:timestamp-ms等于或晚于该值的快照会受到保护,不会被过期处理,即使按保留策略原本应被过期处理。可与snapshot_ids组合使用;在这种情况下,列表中等于或晚于该时间戳的快照不会被过期处理。retention_period = '<duration>'— 仅对本次调用覆盖表级history.expire.max-snapshot-age-ms。早于该时长的快照 (从当前时刻往前计算) 会成为过期候选。该值是一个时长字符串,由一个或多个连续拼接的{number}{unit}对组成。支持的单位:y(365 天) 、w(7 天) 、d(24 小时) 、h(60 分钟) 、m(60 秒) 、s(1 秒) 、ms(1 毫秒) 。单位可以组合,例如'3d'、'12h'、'1d12h30m'、'500ms'。retain_last = N— 仅对本次调用覆盖表级history.expire.min-snapshots-to-keep。无论快照多旧,始终至少保留N个快照。snapshot_ids = [id1, id2, ...]— 仅对列出的快照 ID 执行过期处理 (当前快照、分支或标签引用的快照除外) 。此模式会完全绕过保留策略,且不能与retention_period或retain_last组合使用。dry_run = 1— 计算哪些内容会被过期处理,并返回指标,但不会写入新元数据或删除文件。
retention_period 和 retain_last 仅覆盖表级保留默认值。Iceberg 表属性中为各 ref (branch/tag) 配置的保留覆盖 (例如 refs.<branch>.min-snapshots-to-keep) 绝不会被覆盖——它们始终按表元数据中的配置生效。metric_name String、metric_value Int64) 的表,其中每个指标对应一行。指标名称遵循 Iceberg 规范:
该命令执行以下步骤:
- 评估保留策略 (见下文) ,以确定必须保留哪些快照
- 如果提供了时间戳参数,还会额外保护该时间戳及之后的所有快照
- 让既未被保留策略保留、也未受时间戳保护机制保护的快照过期
- 计算哪些文件仅与已过期的快照关联
- 在正常模式下:生成不包含已过期快照的新元数据
- 在正常模式下:物理删除不可达的 manifest 列表、manifest 文件和数据文件
- 在
dry_run = 1模式下:跳过步骤 5 和 6,仅返回计算出的指标
快照保留策略
expire_snapshots 命令遵循 Iceberg 快照保留策略。保留策略通过 Iceberg 表属性以及按引用的覆盖设置进行配置:
每个快照引用 (Iceberg 元数据中的
refs) 都可以通过引用级字段覆盖这些值:min-snapshots-to-keep、max-snapshot-age-ms 和 max-ref-age-ms。
保留规则评估:
- 对于每个分支 (包括
main) :从分支头开始遍历其祖先链。只要满足以下任一条件,就会保留该快照:- 该快照位于祖先链中的前
min-snapshots-to-keep个快照之内 - 该快照的存在时长未超过
max-snapshot-age-ms(即now - timestamp-ms <= max-snapshot-age-ms)
- 该快照位于祖先链中的前
- 对于标签:被标记的快照会被保留,除非该标签已超过其
max-ref-age-ms,此时会移除该标签引用 - 非
main引用 如果其存在时长超过max-ref-age-ms,将被完全移除 (main分支永远不会被移除) - 悬空引用 如果指向不存在的快照,将在发出警告后被移除
- 当前快照始终会被保留,无论保留设置如何
ALTER TABLE EXECUTE 权限,它在 ClickHouse 访问控制层级中是 ALTER TABLE 的子权限。你可以单独授予该权限,也可以通过其父权限授予:
- 仅支持 Iceberg format version 2 表 (v1 快照不保证包含
manifest-list,而安全识别待清理文件需要它) - 当前快照始终会被保留,即使它早于指定的 timestamp
- 要求启用
allow_insert_into_iceberg设置 - 要求启用
allow_experimental_expire_snapshots设置 - 当 ClickHouse 更新元数据时,目录 自身的授权 (REST catalog auth、AWS Glue IAM 等) 仍会独立执行
删除孤立文件
remove_orphan_files 命令可用于识别并删除这些孤立文件。
语法:
示例:
metric_name 和 metric_value 两列,按类别显示已删除文件的数量 (或在 dry_run 模式下将要删除的文件数量) 。文件类别会基于文件命名约定,采用尽力而为的启发式规则进行分类;不匹配任何特定模式的文件默认计入 deleted_data_files_count:
设置:
- 需要 Iceberg format version 2 (或更高版本) 。 Version 1 表会被拒绝,因为其快照中缺少
manifest-list指针,而安全确定可达文件集合需要这些指针。在 v1 表上运行该命令会返回BAD_ARGUMENTS错误。 - 需要同时启用
allow_insert_into_iceberg和allow_iceberg_remove_orphan_files设置 - 建议先运行
expire_snapshots,再运行remove_orphan_files,以便先清理由已过期快照唯一引用的文件 - 使用
dry_run = 1可在删除前预览孤儿文件 older_than阈值可防止删除仍在写入中的文件——默认 3 天的阈值提供了较为充足的安全余量