常更新:工作里数据处理的一些坑

83 阅读1分钟

参考资料

sql里null对计算的影响

  • 背景:升级后的业务表在hive里存储,同时,为了加速前端查询也copy了一份到clickhouse(ck)里,后续希望有关业务表的使用都切换到ck上,旨在提升数据取用的时效性
  • 目的:历史上,业务表被用于告警检测的数据源,利用presto引擎来检索其数据,并生成告警指标,现在准备将检索引擎切换至ck
  • 问题:其中有一个告警指标sql计算为:r1=sum(a+b)/sum(c)r1 = sum(a + b)/sum(c)。切换ck后,使用相同的sql语法,但结果不一致,后排查是由于 null 导致
  • 结论:由于业务原因,b字段在某些维度下存在null值,结果导致 a + b(null) = null,进而导致sum(78 + null + 22 + ...),原本需要被计算的a被引擎忽略,导致告警指标计算结果错误。业务上,即使bnull,也不能忽略a的值,即ab需要单独求和。在hive写入ck时,对null进行了默认值处理,所以在ck里使用同样的sql出现不同的查询结果。
  • 总结:使用sql对数据进行加工时,假设上游不保证字段非null,内部需要预设对null字段的处理