Python Airflow xcom_pull不提供同一上游任务实例运行的数据,而是提供最新数据
我正在创建一个Airflow@DAG,它有一个BigQueryGetDataOperator的上游任务Python Airflow xcom_pull不提供同一上游任务实例运行的数据,而是提供最新数据,python,airflow,apache-airflow-xcom,Python,Airflow,Apache Airflow Xcom,我正在创建一个Airflow@DAG,它有一个BigQueryGetDataOperator的上游任务get_daily_data,它根据执行日期和下游相关任务获取数据(PythonOperator)通过xcom_pull使用上述基于日期的数据。当我运行气流回填命令时,下游任务处理来自我正在执行xcom\u pull的\u bq的\u数据,它只获取最近的数据,而不是下游任务预期的相同执行日期的数据。 翼型文档说,如果我们传递任务ID的单个字符串,那么将返回来自该任务的最新xcom值 然而,它并没
get_daily_data
,它根据执行日期和下游相关任务获取数据(PythonOperator)通过xcom_pull使用上述基于日期的数据。当我运行气流回填命令时,下游任务处理来自我正在执行xcom\u pull的\u bq
的\u数据,它只获取最近的数据,而不是下游任务预期的相同执行日期的数据。
翼型文档说,如果我们传递任务ID的单个字符串,那么将返回来自该任务的最新xcom值
然而,它并没有说明如何获取DAG执行的同一实例的数据
我问了一个同样的问题,但是,给出的唯一解决方案是我已经在做的事情。但这似乎不是正确的答案
DAG定义:
dag = DAG(
'daily_motor',
default_args=default_args,
schedule_interval='@daily'
)
#This task creates data in a BigQuery table based on execution date
extract_daily_data = BigQueryOperator(
task_id='daily_data_extract',
use_legacy_sql=False,
write_disposition='WRITE_TRUNCATE',
allow_large_results=True,
sql=policy_by_transaction_date_sql('{{ ds }}'),
destination_dataset_table='Test.daily_data_tmp',
dag=dag)
get_daily_data = BigQueryGetDataOperator(
task_id='get_daily_data',
dataset_id='Test',
table_id='daily_data_tmp',
max_results='10000',
dag=dag
)
#This is where I need to pull the data of the same execution date/same instance of DAG run not the most recent task run
def process_bq_data(**kwargs):
bq_data = kwargs['ti'].xcom_pull(task_ids = 'get_daily_data')
#This bq_data is most recent one not of the same execution date
obj_creator = IibListToObject()
items = obj_creator.create(bq_data, 'daily')
save_daily_date_wise(items)
process_data = PythonOperator(
task_id='process_data_from_bq',
python_callable=process_bq_data,
provide_context=True,
dag = dag
)
get_daily_data.set_upstream(extract_daily_data)
process_data.set_upstream(get_daily_data)
您必须收到最新的Xcom值。您还需要确保值实际上与假设的执行日期相同:
:param include_prior_dates:
如果为False,则仅从当前
返回执行日期。
如果为True,则为以前日期的XCOM
也返回。我想知道您的语句-它有一个上游任务,即获取BigQueryGetDataOperator的每日数据,该任务根据执行日期获取数据。我在运算符的源代码或传递给运算符的参数中都没有看到执行日期或{ds}。您确定它根据执行日期获取数据吗?@nightgaunt是的,它在BigQueryOperator中传递sql参数中的{{d}}。这个接线员做的是。。根据执行日期获取数据并转储到临时表,然后在下一个相关任务中提取该数据。哪个基本上是BigQueryGetDataOperator您可以尝试将
include\u preor\u dates=False
添加到xcom\u pull函数中吗?如果它不起作用,您能否尝试包含\u preor\u dates=True
并共享输出?因为它仅在回填中引起问题,并且在付出了大量努力后,当找不到任何具体解决方案时,我在DAG定义参数中使用了dependens\u on\u pass标志为True,这实际上使其顺序执行回填运行。它降低了执行速度,但在365执行实例中只有4-5个执行实例的xcom_pull数据不正确。这是我手动管理的。