我正在尝试从主题中读取avro记录,并在将其加载到表中之前对其进行验证。这是一个正常的验证,基于以下场景:
模式中有两个字段,VP和AH。
条件1:
VP and AH can't have A value at the same time, set err_val ='E' in this case.
条件2:
VP and AH must have value A or I, set err_val = 'E' in case of any other value.
所以,我的情况是这样的:
// logic to identify error records
if ((record.value().get("AH").toString().equals("A") && record.value().get("VP").toString().equals("A"))
|| ((!"I".equals(record.value().get("AH").toString())) || (!"A".equals(record.value().get("AH").toString())))
|| ((!"I".equals(record.value().get("VP").toString())) || (!"A".equals(record.value().get("VP").toString())))
)
{
id = record.value().get("ID").toString();
id_type = record.value().get("ID_TYPE").toString();
ah = record.value().get("AH").toString();
vp = record.value().get("VP").toString();
effective_date = record.value().get("EFFECTIVE_DATE").toString();
end_date = record.value().get("END_DATE").toString();
err_val = "E";
} else {
id = record.value().get("ID").toString();
id_type = record.value().get("ID_TYPE").toString();
ah = record.value().get("AH").toString();
vp = record.value().get("VP").toString();
effective_date = record.value().get("EFFECTIVE_DATE").toString();
end_date = record.value().get("END_DATE").toString();
err_val = "";
}
条件1由if语句中的第一行处理,它按预期工作。但是,接下来的两条线路不适用于条件2。
即使我正在制作这样的唱片:
value={"ID": "461761581", "ID_TYPE": "IN", "AH": "I", "VP": "A", "EFFECTIVE_DATE": "20200501", "END_DATE": "20991231"}
我在输出中得到了"E",这是不正确的。
461761581,IN,I,A,20200501,20991231,E
请提出建议。
试试这个:
String AH = record.value().get("AH").toString();
String VP = record.value().get("VP").toString();
Set<String> filter = Set.of("A", "I");
if (("A".equals(AH) && "A".equals(VP)) || (!filter.contains(AH) && !filter.contains(VP))) {
//do something
} else {
//do something
}
您也可以使用String.matches((
if (("A".equals(AH) && "A".equals(VP)) || (!AH.matches("A|I") && !VP.matches("A|I"))) {
//do something
} else {
//do something
}