如何使用While循环执行Airflow运算符

时间:2018-08-31 20:49:02

标签: python airflow

要求:使用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   

2 个答案:

答案 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或类似的东西更新日期,您必须更加小心