如何不调用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
相关产品推荐
相关产品推荐

