如何使用Airflow中的last_mod_dt(时间戳)从oracle数据源执行每小时增量提取?

如何使用Airflow中的last_mod_dt(时间戳)从oracle数据源执行每小时增量提取?,airflow,etl,data-extraction,lastmodifiedtime,incremental-load,Airflow,Etl,Data Extraction,Lastmodifiedtime,Incremental Load,需要使用Airflow/Python从oracle数据源使用last_modified_dt timestamp列每小时刷新/加载一次表 在Airflow中有Airflow.models.taskinstance API,它公开task_实例元数据表中的数据,并具有以下字段(以示例数据显示),假设dag/tasks第一次执行日期/时间为1/1/2020 05:00:- task_id, dag_id, execution_datetime (of dag), start_date, end_da

需要使用Airflow/Python从oracle数据源使用last_modified_dt timestamp列每小时刷新/加载一次表

在Airflow中有Airflow.models.taskinstance API,它公开task_实例元数据表中的数据,并具有以下字段(以示例数据显示),假设dag/tasks第一次执行日期/时间为1/1/2020 05:00:-

task_id, dag_id, execution_datetime (of dag), start_date, end_date, duration, state, ....
task_a, oracle, 1/1/2020 05:00:00, 1/1/2020 05:00:00, 1/1/2020 05:05:00, 0.5, success, ....
task_b, oracle, 1/1/2020 05:00:00, 1/1/2020 05:01:00, 1/1/2020 05:04:00, 0.3, success, ....
task_c, oracle, 1/1/202005:00:00, 1/1/2020 05:02:00, 1/1/2020 05:06:00, 0.4, success, ....
因此,我考虑使用此task_实例元数据表或API获取每个任务的上一个开始日期时间及其状态(成功),并在如下条件下使用:

因此,在2020年1月1日06:00:00一小时后运行时:-

select * from table_a where last_mod_dttm > prev(start_datetime of task_id=task_a) and state = sucesss;
select * from table_b where last_mod_dttm > prev(start_datetime of task_id=task_b) and state = sucesss;
select * from table_c where last_mod_dttm > prev(start_datetime of task_id=task_c) and state = sucesss;
这种方法正确吗?如果是,那么每次直接查询task_实例表以获取任务的上一个或最大值(start_datetime)会影响性能吗?如果是,那么如何通过airflow.models.taskinstance API()获取任务的上一个开始日期时间和“成功”状态


谢谢

首先,了解执行日期的工作原理非常重要,请参见:

计划程序将不会触发您的任务,直到它覆盖的时间结束 结束,例如,计划间隔设置为@daily runs的作业 这一天结束了。这项技术确保无论什么数据 在dag启用之前,该期间所需的时间已完全可用 执行在UI中,气流似乎正在运行任务 晚了一天。

如果以一天的时间间隔运行DAG,则运行 执行日期2019-11-21在2019-11-21T23:59后不久触发

让我们重复一下,调度程序每隔一个调度周期运行一次作业 在开始日期之后,在期间结束时。

这意味着通过引用
execution\u date
可以准确地获得上次运行的触发时间

关于查询,我不会查询数据库以获取最后的执行日期,而是使用带有以下内容的现成宏:


您应该能够在查询中使用
{{execution\u date}
,并在触发DAG运行时替换它。

感谢@Philipp Johannis,如果您的此语句正确的话:-“这意味着通过引用execution\u date,您可以获得上次运行被触发的确切时间。”-然后,我认为如果我计划每1小时运行一次,就可以解决我的问题,我总是希望得到最后一个执行日期(即一小时前)。虽然,对于第一次初始运行,它会将执行日期视为当前日期/时间吗?因此,我将使用类似于<代码>之类的操作,在这里,“{{ExjordNoDe}}”和“{{NExtReasOnNoReDe}} } /<代码>之间的LASTHYMODYDTDTM——那么,如果您每天运行、每小时或在任何时间间隔运行,都不重要。您可能需要在sql中加入一些强制转换,以便将模板转换为时间戳。我有一个单独的DAG来完成满负荷(计划
@once
)和一个用于增量刷新的DAG.prev_-execution_-date_-success=“{{prev_-execution_-date_-success.strftime(“%Y-%m-%d%H:%m:%S”)}”下一个执行日期=“{{{next_-execution date strftime.strftime(“%Y-%m-%d%H:%m:%S”)}”sql='SELECT*FROM+str+'其中上次修改的日期介于'+''{}'.format(上一次执行日期成功)+'和'+'{}'.format(下一次执行日期)+'.'。SQL generated=从表名称中选择*,其中日期上次在“2020-10-22 13:01:40”和“2020-10-22 16:42:23”之间修改;但是,giving error:-error:必须是str,而不是int。相同的SQL输出在源数据库中运行良好。触发SQL语句时引发错误,还是之前已经引发错误?因为
Error:must是str,not int
是一条python错误消息,而不是来自数据库的错误消息。我的代码中缺少str(),我修复了它。但是,现在我得到一个错误:-“非类型对象”没有属性“strftime”。实际上,为了详细说明,我有一个dag,每个表上有3个任务,我想实现每小时的增量负载。因此,我需要检查上一次dag运行中每个表(任务)的任务实例,并获得上一次执行日期和成功状态(即上一次执行日期和成功)。此外,如果它是第一次执行,那么它应该将以前的执行日期成功默认为当前utc时间。我是这样定义它的: