Avro记录校验逻辑异常求助:VP/AH合法记录被误标记为错误
问题排查与修复
你的问题核心出在条件2的逻辑判断上,我们来一步步拆解问题所在:
看你写的AH字段校验条件:
((!"I".equals(record.value().get("AH").toString())) || (!"A".equals(record.value().get("AH").toString())))
这个逻辑永远为true!因为一个字符串不可能同时等于"I"和"A"——比如AH是"I"时,!"A".equals(...)为true;AH是"A"时,!"I".equals(...)为true。逻辑或(||)的特性是只要有一个条件成立就返回true,所以不管AH取合法值还是非法值,这个条件都会触发。VP字段的校验条件也犯了完全一样的错误,这就导致合法记录也被错误标记为异常。
修正后的代码
我们需要把条件2的逻辑改成逻辑与(&&),意思是:当字段既不是"I"也不是"A"时,才判定为错误。同时我还做了一个小优化:先把所有需要用到的字段值提取出来,避免在条件判断里反复调用record.value().get(...).toString(),让代码更简洁高效。
// 先提取所有需要的字段值,提升可读性和效率 String ah = record.value().get("AH").toString(); String vp = record.value().get("VP").toString(); String id = record.value().get("ID").toString(); String id_type = record.value().get("ID_TYPE").toString(); String effective_date = record.value().get("EFFECTIVE_DATE").toString(); String end_date = record.value().get("END_DATE").toString(); String err_val = ""; // 修正后的错误判断逻辑 if ((ah.equals("A") && vp.equals("A")) || (!ah.equals("I") && !ah.equals("A")) || (!vp.equals("I") && !vp.equals("A")) ) { err_val = "E"; }
测试验证
用你提供的测试记录:
value={"ID": "461761581", "ID_TYPE": "IN", "AH": "I", "VP": "A", "EFFECTIVE_DATE": "20200501", "END_DATE": "20991231"}
修正后的代码会做如下判断:
- AH="I"、VP="A":不满足条件1(不同时为"A");
- AH是合法值"I",VP是合法值"A":不满足条件2;
因此不会触发err_val="E",输出结果会是461761581,IN,I,A,20200501,20991231,,符合预期。
内容的提问来源于stack exchange,提问作者Praveenks
相关产品推荐
相关产品推荐

