如何最好地完成同类数据的高速比较?

数据挖掘 效率 可扩展性 sql
2021-09-27 18:51:16

我经常以低效率来解决这个问题,因为它在优先级列表中总是很低,而且我的客户在事情破裂之前都拒绝改变。我想就如何加快速度提供一些意见。

我在 SQL 数据库中有多个信息数据集。该数据库是供应商设计的,因此我几乎无法控制结构。它是基于类的结构的 sql 表示。它看起来有点像这样:

Main-class table
 -sub-class table 1
 -sub-class table 2
  -sub-sub-class table
 ...
 -sub-class table n

每个表都包含类的每个属性的字段。存在一个包含每个子类的所有字段的连接,该连接包含类表中的所有字段和每个父类表中的所有字段,由唯一标识符连接。

有数百个班级。这意味着成千上万的视图和数万列。

除此之外,还有多个数据集,由 Main-class 表中的字段值指示。生产数据集对所有最终用户可见,还有其他几个数据集由来自各种集成源的相同数据的最新版本组成。

每天,我们都会运行将生产数据集与实时数据集进行比较的作业,并根据一组规则合并数据,清除实时数据集,然后重新开始。这些规则已经到位,因为对于特定类的特定值,我们可能更信任一个数据源而不是另一个数据源。

这些作业本质上是一系列 SQL 语句,它们逐行遍历每个数据集,并在每一行中逐个字段。常见的更改仅限于每行中的少数字段,但由于任何事情都可能改变,我们比较每个值。

有数以千万计的数据行,在某些环境中,合并作业可能需要超过 24 小时。我们通常通过投入更多硬件来解决这个问题,但目前这不是一个 hadoop 环境,因此在这方面可以做的事情非常有限。

您将如何扩展此问题的解决方案以使其没有限制?您将如何实现最有效的数据合并?(目前是逐场比较......非常缓慢)。

2个回答

您不能为每个类创建一个散列,然后逐行、逐个字段地合并散列更改的类吗?如果大多数课程不改变,它应该会更快..

或每行或列的哈希值..取决于数据通常如何变化..

听起来不错。解决方案是否可以将数据转储出来,构建一个快速的自定义处理东西来运行它,然后将其导入回数据库?我见过一些基于 Java 的快速文本处理工具,用于主题建模,每秒处理数百万行文本。

如果这是一个选项,那么您可以构建一个 shell 脚本来首先以尽可能好的格式转储数据。然后进行一些预处理以分离数据集,然后进行比较和更改的实际处理。最后是把它写回一个好的格式输入到数据库中的东西。

绝对不是一个下午的项目,但你可能会在几周内让它工作。