题目重点:从统一过滤合同出发,保持筛选集合、错误计数和时间分桶一致。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练记录为(id,utc_timestamp,level,event_type,message),specific log指event_type过滤;正式题若为文本substring需替换predicate。
- 输入有限批次,时间按UTC小时半开桶;同id重传只计一次,不同id相同内容保留。
- 错误判断采用明确level集合,不猜任何含“error”的字符串都算错误。
解题路线
- LogRecord负责字段解析与合法性,Predicate表达level/type/时间范围等条件,LogAnalyzer先确定匹配集合,再提供filter/count/histogram;三功能共用谓词,避免边界各写一遍而不一致。
- 批次实现一次扫描每条通过谓词的唯一记录,按UTC floor(timestamp/3600)计hour,满足error规则计error_count。返回原记录顺序,histogram按hour排序;是否补零桶要问清。
- 区分输入解析失败与业务error:格式错误单列invalid_count,不能静默跳过后还声称统计覆盖全部。遇到重复id字段不同,要标冲突而非任意取一个不说明。
- 索引(event_type,level,time)可加快重复查询,但存储与更新成本也增加;复杂谓词仍需评估候选记录。提前把所有filter结果cache会在新数据到来时失效,必须绑定版本。
- 时间语义细问event time vs ingest time、UTC vs当地时间、跨夏令时重叠小时。训练固定UTC;本地hour仅显示标签,真正bucket key仍应可唯一识别。
- 增长到持续流时,按hour/event_type增量聚合并定义watermark与晚到纠正;仍保留原记录才能回答新过滤条件。只留下计数桶无法还原filter结果。
手动走一遍
训练同type=payment的三条唯一日志,时间00:59、01:00、01:40,其中后两条ERROR,则hour桶00:00→1、01:00→2,error_count=2;重传01:00同id不能把两项统计都加一。
规模与取舍
批次n条、h桶,扫描O(n)期望,输出排序O(h log h),去重O(n)、桶O(h)空间;筛选记录输出O(m)。按type索引缩小候选量但不是所有任意filter都O(1)。
易错点与追问
容易失分的边界
- filter、count与histogram用不同时间边界。
- 只用message含error作为错误级别。
- UTC与本地小时混合。
- 重传计数翻倍,或错误地合并不同id同内容。
继续深挖
- specific log若指substring该如何替换?
- 跨一天缺小时桶补零规则?
- 晚到记录如何纠正已展示的小时计数?
