我知道约束编程背后的直觉,所以我从未真正体验过使用约束求解器进行编程。尽管我认为能够实现我们定义为一致数据的情况是不同的情况。
上下文:
我们有一套规则要在 ETL 服务器上实现。这些规则是:
- 作用于一行。
- 在一个表或不同表中行间执行。
- 在两次运行之间以相同的方式运行(它应该对所有数据保持相同的约束,或者只对最后 n 次运行保持相同的约束);
第三种情况与第二种情况不同,因为它适用于第二种情况,但适用于明确定义的运行次数。它可能适用于单次运行(一个文件),或介于(1 到 n(前一个)或所有文件)之间。
从技术上讲,正如我们构想的 ETL,它在两次运行之间没有内存:两个文件(但这需要重新考虑)
对于第三种规则的应用,ETL需要有内存(我想我们最终会在ETL中备份数据);或者通过在某个时间窗口后对整个数据库无限地重新检查(一个作业),所以最终在数据库中的数据不一定及时满足第三种规则。
示例:
当我们有一个连续流动的数据时,我们应用约束来拥有一个完整的受限数据库,第二天我们将收到一个备份或更正数据,比如一个月,对于这个时间窗口,我们希望满足约束只有这次运行(这个时间窗口),而不用担心整个数据库,对于 future 的运行,所有数据都应该像以前一样受到限制,而不用担心过去的数据。您可以想象其他适合 Temporal logic 的规则.
目前,我们只实现了第一种规则。我的想法是拥有一个缩小的数据库(任何类型的:MySQL、PostgreSQL、MongoDB ...)来备份所有数据(仅受约束的列,可能具有散列值),并带有基于早期一致性的标志一种规则。
问题:是否有任何解决方案/概念替代方案可以简化此过程?
用 Cook 编程语言说明;一组规则和以下操作的示例:
run1 : WHEN tableA.ID == tableB.ID AND tableA.column1 > tableB.column2
BACK-UP
FLAG tableA.rule1
AFTER run1 : LOG ('WARN')
run2 : WHEN tableA.column1 > 0
DO NOT BACK-UP
FLAG tableA.rule2
AFTER run2 : LOG ('ERROR')
注意: 虽然约束规划在理论上是解决组合问题的范例,并且在实践中可以加速问题的开发和执行;我认为这不同于约束解决问题;由于第一个目的不是在解决之前优化约束,甚至可能不会限制数据域;它主要关注的是在数据接收上应用规则并执行一些基本操作(拒绝一行、接受一行、记录...)。
我真的希望这不是一个非常宽泛的问题,这是正确的地方。
最佳答案
我找到了一个复杂的解决方案来实现比我想象的更多;谈论检查数据一致性。显然这就是我们所说的测试驱动数据分析
现在有了这个实现,我们就绑定(bind)了 Python 和 Pandas,但幸运的是,不仅如此。我们甚至可以检查 MySQL、PostgreSQL ……表中的数据一致性。
我没想到的是,我们可以根据样本数据推断规则。这可能有助于制定规则。
这就是为什么有 tdda.constraints.verify_df
和 tdda.constraints.discover_df
的原因。
据我所知,它没有提出用于检查最后 (n) 个文件的(较弱)一致性的解决方案。我想到了我们可以称之为批处理文件一致性的东西,它只确保某些运行集(最后 n 次运行)而不是所有数据的规则满足。 它只作用于单个文件,它需要更高级别的连接才能调节连续到达的 (n) 个文件。
更多: https://tdda.readthedocs.io/en/latest/constraints.html#module-tdda.constraints
assertCSVFilesCorrect
检查目录中的一组文件,同样适用于 Pandas 数据帧等。
来自官方文档:
The tdda.constraints library is used to discover constraints from a (Pandas) DataFrame, write them out as JSON, and to verify that datasets meet the constraints in the constraints file. It also supports tables in a variety of relation databases. There is also a command-line utility for discovering and verifying constraints, and detecting failing records.
ps:我仍然对其他解决方案持开放态度,让我知道,因为我认为这是任何 ETL 解决方案的用例。
我也开赏金来进一步丰富回复。
关于database - 约束数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58199623/