建议 pattern/strategy 比较两组数据(新数据与现有数据)...保留现有数据中不存在的新数据
Recommended pattern/strategy to compare two sets of data (new vs existing)... remaining with new data that's not in existing
我有一个 ETL process/job,它以预定的方式将数据库数据从源提取到目标。
[Source data]
定期使用来自某些外部的新数据进行更新
资源。 [Destination data]
是使用的 [Source data]
的子集
下游业务。
[Destination data]
中的约束要求是应该
没有重复(可能发生,例如,在工作的情况下
失败,然后新的提取是 运行 在一些数据可能被导入之后)
- 作业一次导入1000条记录
- Scheduler/Job 有其他职责和它处理的其他数据
我的一个 "feasible" 选项涉及:
- 正在从目标、
中获取 所有预计的 composite/key 列
- 正在与新加载的 1000 条记录进行比较(仍然有很多
记录)。
- 然后保存新的
[Source data]
[Destination Data]
。
- 我想象包含现有
[Destination data]
的数据结构将是以下结构的 Hashset,例如 HashSet<int,string,string>
。其中3个数据项唯一标识一条记录。
- 然后我会得到 1000 条记录,循环遍历它们,与 HashSet 进行比较。
我担心内存中的数据太多。
任何关于更好方法的建议,或者这是最有效的方法吗?
只是为了分享,我找到了一个有全面答案的类似问题。它在 Java 中,但很容易转换为 C#。
仍然对任何替代方案持开放态度。否则会将此标记为答案并指出重复。
...我们可以按升序排列所有元素的 ID(一次性 O(n log n)
成本),并使用跳过元素的 O(n)
算法迭代它们它们比另一个序列中的当前元素大。这样更好,但仍然不是最优的。
最佳解决方案是创建 bs
集合的哈希 ID 集合。这不需要对两个集合进行排序,并允许进行线性时间成员资格测试。 assemble 一组 ID 有一次性 O(n)
成本。
HashSet<Integer> bIds = new HashSet<>(bs.size());
for (B b : bs)
bIDs.add(b.getId());
for (A a : as)
if (bIds.contains(a.getId()))
cs.add(a);
此解决方案的总复杂度为 O(|as| + |bs|)
。
https://softwareengineering.stackexchange.com/a/258325/132218
我有一个 ETL process/job,它以预定的方式将数据库数据从源提取到目标。
[Source data]
定期使用来自某些外部的新数据进行更新 资源。[Destination data]
是使用的[Source data]
的子集 下游业务。[Destination data]
中的约束要求是应该 没有重复(可能发生,例如,在工作的情况下 失败,然后新的提取是 运行 在一些数据可能被导入之后)- 作业一次导入1000条记录
- Scheduler/Job 有其他职责和它处理的其他数据
我的一个 "feasible" 选项涉及:
- 正在从目标、 中获取 所有预计的 composite/key 列
- 正在与新加载的 1000 条记录进行比较(仍然有很多 记录)。
- 然后保存新的
[Source data]
[Destination Data]
。 - 我想象包含现有
[Destination data]
的数据结构将是以下结构的 Hashset,例如HashSet<int,string,string>
。其中3个数据项唯一标识一条记录。 - 然后我会得到 1000 条记录,循环遍历它们,与 HashSet 进行比较。
我担心内存中的数据太多。
任何关于更好方法的建议,或者这是最有效的方法吗?
只是为了分享,我找到了一个有全面答案的类似问题。它在 Java 中,但很容易转换为 C#。
仍然对任何替代方案持开放态度。否则会将此标记为答案并指出重复。
...我们可以按升序排列所有元素的 ID(一次性 O(n log n)
成本),并使用跳过元素的 O(n)
算法迭代它们它们比另一个序列中的当前元素大。这样更好,但仍然不是最优的。
最佳解决方案是创建 bs
集合的哈希 ID 集合。这不需要对两个集合进行排序,并允许进行线性时间成员资格测试。 assemble 一组 ID 有一次性 O(n)
成本。
HashSet<Integer> bIds = new HashSet<>(bs.size());
for (B b : bs)
bIDs.add(b.getId());
for (A a : as)
if (bIds.contains(a.getId()))
cs.add(a);
此解决方案的总复杂度为 O(|as| + |bs|)
。
https://softwareengineering.stackexchange.com/a/258325/132218