Сравните два набора данных (два набора результатов) из другой базы данных в Java - PullRequest
2 голосов
/ 09 апреля 2019

Я пытаюсь сравнить два набора данных из разных БД через Java.Источник БД: -oracle, sql, др. База данных.Цель db:Hive

Я установил соединение JDBC с обеими базами данных и извлек результат в двух разных наборах результатов.

sourceData  
targetData

Теперь я хочу сравнить два набора результатов и указатьразличия.Подход, который я думаю, состоит в том, чтобы добавить оба набора результатов к хэш-карте и сравнить.Пожалуйста, дайте мне знать, если мой подход правильный или есть лучший способ сделать то же самое.

Пожалуйста, поделитесь ссылками, которые могут мне помочь.

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 09 апреля 2019

Аналогично решению, предложенному @ Hades , но вместо этого используйте Set s.

Создайте класс-держатель, который содержит все значения, которые вы хотите сравнить, и который переопределяетequals() и hashCode():

class Data {
    // the fields you wish to compare

    // override hashCode

    // override equals
}

Создать Set<Data> source, target; (используйте LinkedHashSet, если важен порядок строк) и добавить строки из ResultSet sourceData в source и те жедля targetData.

Тогда вы можете использовать простые операции Set.

  1. Это оставит все элементы в copy, которые не происходит в target:

    Set<Data> copy = new LinkedHashSet<>(source);
    copy.removeAll(target);
    
  2. Это сохранит все элементы в copy, которые do встречаются в target:

    Set<Data> copy = new LinkedHashSet<>(source);
    copy.retainAll(target);
    
  3. Это создаст объединение всех элементов в copy и target:

    Set<Data> copy = new LinkedHashSet<>(source);
    copy.addAll(target);
    

Я создал copy поскольку эти операции изменяют Set, таким образом (при использовании копии) ваш Set<Data> source не изменится.

Вы также можете обернуть все эти вызовы removeAll(), retainAll() и addAll() вif - заявление, которое позволяет вам напрямуюсовершать действияНапример, с removeAll():

if(copy.removeAll(target)) {
    // elements were removed from copy which were in target
} else {
    // nothing was removed
}
1 голос
/ 09 апреля 2019

Реализация на самом деле зависит от ваших требований.

Имеет ли значение порядок строк или столбцов? Нужно ли сравнивать типы данных? и т.д.

Самый простой подход для вас - запустить два запроса с предложением ORDER BY, одинаковыми для обоих запросов. И сравните строки из наборов данных за одну итерацию, что-то вроде:

ResultSet rs1 = ...;
ResultSet rs2 = ...;

boolean rs1next;
boolean rs2next;
while ((rs1next = rs1.next()) || (rs2next = rs2.next())) {
     //do your stuff here
}
0 голосов
/ 09 апреля 2019

Я помогу вам с подходом hashmap. Предполагается, что , который вы установили, содержит уникальные значения. Мой следующий код поможет вам.

Set<Data> soruceData;
Set<Data> targetData;
HashMap<Data,Integer> comparisonMap;
for(Data data:targetData){
 comparisonMap.put(data,0);
}
for(Data data:soruceData){
if(targetData.contains(data))
 comparisonMap.put(data,1);
else
 comparisonMap.put(data,0);
}

Теперь у вас есть хэш-карта, в которой говорится о разнице между двумя списками. 1 - означает наличие в двух наборах 0 - означает, что нет ни в одном из наборов

ПРИМЕЧАНИЕ пожалуйста, используйте hascode и равно при использовании set и hascode

...