要求:使用while循环为每个日期运行SQL查询。例如:开始日期选择为8月25日,结束日期选择为8月28日。然后BigQueryOperator首先运行8月25日,然后运行8月26日,依此类推,直到8月28日。
问题:在DAG下,它仅执行开始日期的查询,然后完成作业。它甚至不会执行/迭代BigQueryOperator直到下一个日期,依此类推。
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.contrib.operators.bigquery_operator import BigQueryOperator
from datetime import date, datetime, timedelta
import datetime
default_args = {
'owner': 'airflow',
'start_date': datetime.datetime(2018, 8, 31),
'email': ['xyz@xyz.com'],
'email_on_failure': True,
'retries': 1,
'retry_delay': timedelta(minutes=10),
'depends_on_past': False
}
dag = DAG('his_temp',default_args=default_args,schedule_interval=None)
date1 = datetime.date(2018, 8, 25)
date2 = datetime.date(2018, 8, 28)
day = datetime.timedelta(days=1)
while date1 <= date2:
parameter = {
'dataset': "projectname.finance",
'historical_date': date1.strftime('%Y%m%d')
}
sqlpartition = BigQueryOperator(
task_id='execute_sqlpartition',
use_legacy_sql=False,
write_disposition='WRITE_TRUNCATE',
allow_large_results=True,
bql="sqlqueries/sqlpartition.sql",
destination_dataset_table=parameter.get('dataset') + "." + "date_partition_" + parameter.get('historical_date'),
params=parameter,
bigquery_conn_id='bigquery',
dag=dag)
print "data loaded for "+ parameter.get('historical_date')
date1 = date1 + day
答案 0 :(得分:1)
Airflow计划程序的整个概念是它将计划任务,您只需要正确配置它即可。难怪它会按提到的开始日期运行一次,因为开始日期会被选择,并且由于没有安排每日任务,因此它将运行一次并停止。您必须在dag级别而不是操作员级别进行配置。
请参考文档以获取正确的时间安排和调度间隔Scheduler docs
答案 1 :(得分:0)
您可以在依赖关系的末尾添加一个自触发运算符。类似于以下内容:
def trigger_check(context, dag_run_obj):
if date1 <= date2:
return dag_run_obj
trigger = TriggerDagRunOperator(
task_id="test_trigger_dagrun",
trigger_dag_id="his_temp",
python_callable=trigger_check,
... more arguments
)
op1 >> op2 >> ... >> trigger
首次触发时,它将循环显示日期,直到达到date2阈值。您必须使有序的PythonOperator或类似的东西更新日期,您必须更加小心