Проверка записи для выявления записей об ошибках путем сравнения строк - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь прочитать записи avro из топи c и проверить его перед загрузкой в ​​таблицу. Это обычная проверка, основанная на следующем сценарии:

В схеме есть два поля, 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

Пожалуйста, предложите.

1 Ответ

0 голосов
/ 09 июля 2020

Попробуйте следующее:

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
}
...