用途:针对 Python 中查询 Rerun catalog(rerun.catalog.CatalogClient → dataset.reader(...) → DataFusion DataFrame)的性能模式与常见陷阱,适合查询意外变慢时参考。DataFusion 本身的 DataFrame、SessionContext 与表达式 API 由 datafusion-python 技能覆盖;未安装时可让用户全局安装:npx skills add apache/datafusion-python。
成本模型:每次物化 reader DataFrame 都是一次云往返,主要成本来自网络与解码而非计算。应优先控制往返次数,其次控制传输字节。单次往返即便结果很小也常需数秒,因此应按“一次查询覆盖所有段/实体”组织,而非逐段、逐实体循环。
主要能力与用法:在 .reader(...) 之前尽量应用 filter_contents 与时间窗口过滤,时间过滤需用索引列与字面量比较才可下推,索引列上的转换或算术不会下推。重复消费同一物化结果时用 DataFrame.cache(),但若下游仍是惰性 DataFrame 继续组合,则不应缓存,以免破坏整体计划优化。跨段查询可去掉 filter_segments,借助每行的 rerun_segment_id 在本地分组;同段内多实体可一次 reader 后用各实体列的 is_not_null() 本地过滤。count() 不一定下推,判断“是否存在”优先用 limit(1) 探测。using_index_values 配合 fill_latest_at 适合最近值重采样,不适合用作存在性检查。schema() 只需一次往返,可先看有哪些实体/组件列;但 schema 存在不等于有事件。注意 reader 行布局:实体是列不是行,没有 rerun_entity_path 行属性,count() 返回所有实体总事件数。对 null struct 的字段访问会返回 0.0 而非 null,需加 null 守卫,且只对 struct 源使用。调试时分别计时惰性构建与终端物化、统计往返次数、用 nbytes 检查实际传输量。
限制:该技能聚焦 catalog 特有问题,不替代 datafusion-python 的通用 API 参考;具体性能数字取决于网络与环境。