空值和零值在移动优化软件里通常不是同一件事:零值往往表示“测到了,结果是0”,空值更常表示“这次没有可用的测量结果”。但这不是铁律。要区分,得先看字段类型、查询条件、数据管线阶段和返回结构,再决定是保留原值、改写为可解释状态,还是退出这次判断。
在移动优化软件中,同一个“0”放在不同字段里,含义可能完全相反。计数类字段出现0,通常意味着该维度下确实没有匹配记录;比率类字段出现0,可能是分子为0,也可能是分母被过滤后仍保留了记录;时长类字段出现0,则常常是采集端没有拿到有效时间戳,而不是“耗时真的为零”。
判断时先做一步:查该字段在数据字典里的类型和空值策略。如果字段被定义为“非空计数”,返回0一般可以保留;如果字段被定义为“可空测量值”,返回0就需要和空值一起看,不能直接当成有效测量。这个动作的结果会直接决定下一步:保留0意味着可以进入聚合,改写0意味着要加状态说明,退出则意味着这次结果不能用于比较。
用户已经尝试常规做法仍未解决时,遗漏条件经常出在查询条件本身。假设一个移动优化软件返回某渠道的“平均加载耗时”为0,同时另一个渠道返回空值。可能的原因包括:
这几种原因对应的处理方式不同。如果是过滤导致空值,应该保留空值并检查过滤条件,而不是把空值改写成0;如果是连接导致空值,应该保留空值并检查连接键;如果是占位0,应该把0改写为“未采集”状态,避免它进入平均值。这里的关键动作是:对返回结果按分组字段和连接键做一次小样本对照,观察空值和零值分别落在哪些组里。对照结果会告诉你,问题是出在查询条件、数据写入,还是字段定义。
面对空值和零值,实际决策可以归为三类,但不必强行三选一,因为前提不同。
保留原值适用于:字段定义明确,空值表示“未测量”,零值表示“测量结果为零”,且下游消费方能区分两者。此时保留原值,后续聚合时单独处理空值即可。
改写为显式状态适用于:下游系统或报表无法区分空值和零值,或者空值会被自动转成0。此时应把空值改写为“无数据”“未采集”等状态字段,而不是留一个容易被误读的空字符串。改写的代价是增加字段和映射逻辑,收益是避免把“没测到”算成“测到0”。
退出本次判断适用于:空值和零值同时大量出现,且无法从现有字段和查询条件中判断原因。此时继续比较数值没有意义,应该先补采集或补日志,再回到判断。退出的前提是确认当前数据管线存在缺口,而不是简单因为结果不好看就放弃。
假设某移动优化软件返回三个渠道的“首屏渲染耗时”:A渠道为0,B渠道为空值,C渠道为1200毫秒。先不要直接算平均。第一步,检查A渠道的原始记录条数:如果条数为0,说明没有样本,0是聚合占位;如果条数大于0但耗时全为0,说明采集端可能写入了默认值。第二步,检查B渠道的空值是否来自连接丢失:如果连接键在维表中不存在,空值就是连接结果,不是测量结果。
假设检查后发现A渠道是聚合占位、B渠道是连接丢失,那么下一步不是把A的0和B的空值都改成0再平均,而是把A标记为“无样本”、B标记为“维度未匹配”,只对C做单渠道判断。这个动作的结果是:原本看似三个渠道可比较,实际只有一个渠道的数据可用于当前判断。下一步要么补A和B的采集或维表,要么把结论范围缩小到C。
很多人会先看返回值本身,却漏掉返回结构里的元数据。移动优化软件的接口或导出文件里,除了数值字段,通常还有状态码、样本量、采集时间、是否截断等字段。空值和零值的含义,往往要靠这些元数据才能确定。例如,同样返回0,样本量大于0且采集时间正常,可能是真实零值;样本量为0或采集时间为空,则更可能是占位或未采集。
因此,实际动作可以固定为:先读元数据,再读数值字段,最后才决定保留、改写或退出。如果元数据缺失,就不要对空值和零值做推断,先补齐元数据或回到原始日志核对。这个条件不解决,后面所有关于0和空的解释都只是猜测。