我正在尝试通过Java比较来自不同数据库的两个数据集。
源数据库:-oracle,sql,其他数据库。
指定db:Hive
我已经对这两个数据库建立了JDBC连接,并在两个不同的结果集中提取了结果。
sourceData
targetData
现在,我想比较两个结果集并指出差异。我正在考虑的方法是将两个结果集都添加到哈希图并进行比较。请让我知道我的方法是正确的还是有更好的方法来做到这一点。
请分享对我有帮助的链接。
谢谢。
答案 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
操作。
这将保留copy
中所有不会在target
中出现不会的元素:
Set<Data> copy = new LinkedHashSet<>(source);
copy.removeAll(target);
这将保留copy
中出现的所有在target
中出现的所有元素:
Set<Data> copy = new LinkedHashSet<>(source);
copy.retainAll(target);
这将创建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 :(得分: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