Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 递归地审核较小的时间段,以确定差异的来源_Python_Database_Etl - Fatal编程技术网

Python 递归地审核较小的时间段,以确定差异的来源

Python 递归地审核较小的时间段,以确定差异的来源,python,database,etl,Python,Database,Etl,我有一个数据复制过程,它通过API从外部源增量提取数据。有时,由于竞争条件、源错误等原因,此过程会导致丢失数据。为了审核此过程,我希望比较在逐渐缩短的时间段内的行数,直到我确定差异发生的日期,并仅复制该日期。我无法以编程方式提取所有日期的每个日期聚合行数,我只能指定一个范围,需要限制API调用 工艺流程基本上应遵循: 比较从开始到现在的行数。如果存在不匹配: 比较起始日期范围内每年(或365天期间)的行数。如果起始日期期限小于1年,则跳过此步骤。如果仍然存在不匹配: 比较当前年份中每个月(或3

我有一个数据复制过程,它通过API从外部源增量提取数据。有时,由于竞争条件、源错误等原因,此过程会导致丢失数据。为了审核此过程,我希望比较在逐渐缩短的时间段内的行数,直到我确定差异发生的日期,并仅复制该日期。我无法以编程方式提取所有日期的每个日期聚合行数,我只能指定一个范围,需要限制API调用

工艺流程基本上应遵循:

  • 比较从开始到现在的行数。如果存在不匹配:
  • 比较起始日期范围内每年(或365天期间)的行数。如果起始日期期限小于1年,则跳过此步骤。如果仍然存在不匹配:
  • 比较当前年份中每个月(或30天期间)的行计数是否不匹配。如果仍然存在不匹配:
  • 比较当月每周(或7天期间)的行数。如果仍然存在不匹配:
  • 比较当前周中每天的行数。应重新复制不匹配的日期
我无法想出一个优雅的解决方案来解决这个问题,这是迄今为止我所做的最好的尝试:

def backfill(start_ts: datetime.datetime, end_ts: datetime.datetime, replicate_process: typing.Callable, audit_process: typing.Callable) -> bool:
    brackets = [365, 30, 7, 1]
    funnel = [(end_ts - start_ts).days]
    funnel = sorted([i for i in brackets if i > funnel[0]], reverse=True)
    audit_bool = False

    increment_start = start_ts
    increment_end = end_ts

    while increment_start < increment_end:
        while not audit_bool:
            for days in funnel:
                audit_bool, increment_start, increment_end = audit_process(days, increment_start, increment_end)
                if days == 1:
                    replicate_process(increment_start, increment_end)
def回填(开始:datetime.datetime,结束:datetime.datetime,复制\u进程:typing.Callable,审核\u进程:typing.Callable)->bool:
括号=[365,30,7,1]
漏斗=[(结束-开始)。天]
漏斗=已排序([i为i,如果i>漏斗[0]],则括号中为i,反之为True)
审计布尔=假
增量开始=开始
增量=结束
当增量_开始<增量_结束时:
而不是审计业务:
漏斗中的天数:
审核开始,增量开始,增量结束=审核过程(天数,增量开始,增量结束)
如果天数==1:
复制\u过程(增量\u开始、增量\u结束)
我还没有弄清楚如何在流程中每个步骤的特定范围内在循环中工作,以及如何决定何时审计流程返回true意味着退出循环,而不是继续


这是一个我不知道的惯用面向对象设计模式的问题吗?对我来说,这似乎是指数退避的逆过程,你可以尝试指数式地缩短时间,直到周期为1。虽然在本例中,刻度是日期表示。

忽略年、月和日。只需使用天和二进制除以周期。例如,在20190101和20191031之间有拉力。找到该期间的中点,然后在20190101和20190530之间搜索,然后在20190531和20191031之间搜索。你可以向这个API发送任意日期,对吗?这就更有意义了!是的,日期可以是任意的。我专注于一个月的审计失败,然后在那个月进行了3次成功和1次失败的审计,我甚至没有考虑过使用一个任意的开始和结束日期。