场景:实用场景,源数据库A的a表抽取部分数据同步到目标数据库B的b表,不依靠ETL抽取情况下用JAVA代码简单实现。a表与b表需通过一个不重复且不空的的字段进行标识(根据情况可以选择主键),进行匹配同步。
抽取数据库A的a表存放在BIG_MAP,map的KEY为标识字段,value存放抽取数据库A的a表的对象。
抽取数据库B的b表存放在SMALL_MAP,map的KEY为标识字段,value存放抽取数据库B的b表的对象。
例如:
BIG_MAP与SMALL_MAP之间的交集数据,这部分数据可以认定为正确数据,或自定义逻辑对比交集中数据做为目标数据库需更新的数据;
BIG_MAP与(BIG_MAP与SMALL_MAP之间的交集数据)的差集,则为目标数据库需要新增的数据;
SMALL_MAP与(BIG_MAP与SMALL_MAP之间的交集数据)的差集,则为目标数据库需要删除的数据;
或以BIG_MAP/SMALL_MAP 其一优先的并集数据,则可以确定为A+B数据库的总数据;
下方为JAVA两个MAP并集,交集,差集的工具类。
import java.util.Map;
import java.util.Set;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
public class MapUtil {
/**
* 取Map集合的差集
*
* @param bigMap 大集合
* @param smallMap 小集合
* @return 两个集合的差集
*/
public static Map<String, Object> getDifferenceSetByGuava(Map<String, Object> bigMap,
Map<String, Object> smallMap) {
Set<String> bigMapKey = bigMap.keySet();
Set<String> smallMapKey = smallMap.keySet();
Set<String> differenceSet = Sets.difference(bigMapKey, smallMapKey);
Map<String, Object> result = Maps.newHashMap();
for (String key : differenceSet) {
result.put(key, bigMap.get(key));
}
return result;
}
/**
* 取Map集合的并集
*
* @param map1 大集合
* @param map2 小集合
* @return 两个集合的并集
*/
public static Map<String, Object> getUnionSetByGuava(Map<String, Object> map1, Map<String, Object> map2) {
Set<String> bigMapKey = map1.keySet();
Set<String> smallMapKey = map2.keySet();
Set<String> differenceSet = Sets.union(bigMapKey, smallMapKey);
Map<String, Object> result = Maps.newHashMap();
for (String key : differenceSet) {
if (map1.containsKey(key)) {
result.put(key, map1.get(key));
} else {
result.put(key, map2.get(key));
}
}
return result;
}
/**
* 取Map集合的交集(String,String)
*
* @param map1 大集合
* @param map2 小集合
* @return 两个集合的交集
*/
public static Map<String, Object> getIntersectionSetByGuava(Map<String, Object> map1, Map<String, Object> map2) {
Set<String> bigMapKey = map1.keySet();
Set<String> smallMapKey = map2.keySet();
Set<String> differenceSet = Sets.intersection(bigMapKey, smallMapKey);
Map<String, Object> result = Maps.newHashMap();
for (String key : differenceSet) {
result.put(key, map1.get(key));
}
return result;
}
}