You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不调用history()获取OPTIMIZE操作返回的p50FileSize指标

无需调用.history()获取OPTIMIZE分位文件大小指标的方法

OPTIMIZE命令直接返回的默认打印结果确实不会展示p25FileSize、p50FileSize、p75FileSize这类分位指标,但不需要调用全量.history()接口就能拿到这些值,两种实现方式都比全量扫描历史的方案效率高:

1. 直接从OPTIMIZE返回结果提取(Delta Lake 2.1及以上版本适用)

高版本Delta Lake中,OPTIMIZE返回的DataFrame实际已经携带了所有执行指标,只是分位值没有放在默认展示的扁平字段里,直接从嵌套的metrics结构体取值即可,不需要额外访问表元数据:

# 执行OPTIMIZE语句拿到返回结果
opt_df = spark.sql("OPTIMIZE delta.`/path/to/your/delta/table`")
# 直接提取对应分位指标
p25 = opt_df.select("metrics.p25FileSize").first()[0]
p50 = opt_df.select("metrics.p50FileSize").first()[0]
p75 = opt_df.select("metrics.p75FileSize").first()[0]

2. 单版本提交元数据查询(全Delta版本通用,无额外开销)

如果你的Delta版本低于2.1,OPTIMIZE返回结果没有暴露这些分位字段,也不需要调用无参的.history()方法——无参.history()默认会扫描最近100次提交的元数据,开销不必要。你可以在OPTIMIZE执行完成后,只拉取最新1个版本的提交信息即可,性能和直接从返回结果取数基本一致:

from delta.tables import DeltaTable

# 执行OPTIMIZE
spark.sql("OPTIMIZE delta.`/path/to/your/delta/table`")
dt = DeltaTable.forPath(spark, "/path/to/your/delta/table")
# 仅查询最新1次提交的元数据,不扫描全量历史
latest_commit_metrics = dt.history(1).first().operationMetrics
p25 = latest_commit_metrics["p25FileSize"]
p50 = latest_commit_metrics["p50FileSize"]
p75 = latest_commit_metrics["p75FileSize"]

注意:执行OPTIMIZE后不要插入其他会修改表版本的操作,否则拿到的最新版本就不是OPTIMIZE对应的提交了。


内容的提问来源于stack exchange,提问作者Jack Fratto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 01:27:29