比较Java中来自不同数据库的两个数据集(两个结果集)

时间:2019-04-09 06:45:09

标签: java hashmap resultset

我正在尝试通过Java比较来自不同数据库的两个数据集。 源数据库:-oracle,sql,其他数据库。 指定db:Hive

我已经对这两个数据库建立了JDBC连接,并在两个不同的结果集中提取了结果。

sourceData  
targetData

现在,我想比较两个结果集并指出差异。我正在考虑的方法是将两个结果集都添加到哈希图并进行比较。请让我知道我的方法是正确的还是有更好的方法来做到这一点。

请分享对我有帮助的链接。

谢谢。

3 个答案:

答案 0 :(得分:2)

@Hades提出的解决方案类似,但使用Set

创建一个holder类,其中包含您要比较的所有值,并覆盖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中出现的所有在target中出现的所有元素:

    Set<Data> copy = new LinkedHashSet<>(source);
    copy.retainAll(target);
    
  3. 这将创建copytarget中所有元素的并集:

    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 :(得分:1)

实施实际上取决于您的要求。

行或列的顺序重要吗?您是否必须比较数据类型?等

对您而言,最简单的方法是使用ORDER BY子句运行两个查询,两个查询都相同。然后一次迭代比较数据集中的行,就像:

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

boolean rs1next;
boolean rs2next;
while ((rs1next = rs1.next()) || (rs2next = rs2.next())) {
     //do your stuff here
}

答案 2 :(得分:0)

我将帮助您使用哈希图方法本身。 您设置的假设包含唯一值。 我的以下代码将为您提供帮助。

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-表示不存在任何集合

注意,请在使用set和hascode时正确实现hascode和equals