如何使用Airflow在Python函数中触发运算符?

如何使用Airflow在Python函数中触发运算符?,airflow,Airflow,我有以下代码: def chunck_import(**kwargs): ... for i in range(1, num_pages + 1): start = lower + chunks * i end = start + chunks if i>1: start = start + 1 logging.info(start, end) if end >

我有以下代码:

def chunck_import(**kwargs):
    ...
    for i in range(1, num_pages + 1):
        start = lower +  chunks * i
        end = start + chunks
        if i>1:
             start = start + 1
        logging.info(start, end)
        if end > max_current:
            end = max_current
        where = 'where orders_id between {0} and {1}'.format(start,end)
        logging.info(where)
        import_orders_products_op = MySqlToGoogleCloudStorageOperator(
            task_id='import_orders_and_upload_to_storage_orders_products_{}'.format(i),
            mysql_conn_id='mysql_con',
            google_cloud_storage_conn_id='gcp_con',
            provide_context=True,
            approx_max_file_size_bytes = 100000000, #100MB per file
            sql = 'import_orders.sql',
            params={'WHERE': where},
            bucket=GCS_BUCKET_ID,
            filename=file_name_orders_products,
            dag=dag)

    start_task_op = DummyOperator(task_id='start_task', dag=dag)

    chunck_import_op = PythonOperator(
        task_id='chunck_import',
        provide_context=True,
        python_callable=chunck_import,
        dag=dag)

    start_task_op >>  chunck_import_op
此代码使用
PythonOperator
计算我需要从
mysqltologlecloudstorageoperator
运行多少次,并创建
其中的
SQL集群,然后它需要执行它

问题是没有执行
mysqltologlecloudstorageoperator

实际上我做不到

chunck_import_op >> import_orders_products_op

如何使
mysqltologlecloudstorageoperator
PythonOperator
中执行?

我认为在for循环结束时,您需要调用
import\u orders\u products\u op.execute(context=kwargs)
前面可能有
import\u orders\u products\u op.pre\u execute(context=kwargs)
。这有点复杂,因为它跳过了
task\u实例
render\u templates()
调用,实际上,如果您创建了一个
task\u实例
来放入这些任务,您可以调用
run
\u raw\u run\u task
,但这两个实例都需要来自dagrun的信息(您可以在python可调用的上下文中获得它,如
kwargs['dag_run']


查看您传递给操作符的内容,它看起来像是原样您需要模板步骤来加载
import\u orders.sql
文件并填写
WHERE
参数。或者,在可调用本身中,可以将文件加载到字符串中,替换
{params.WHERE}
部分(以及任何其他)在没有Jinja2的情况下手动(或者您可以花时间找出正确的Jinja2调用),然后在调用
import\u orders\u products\u op.sql>之前设置
import\u orders\u products\u op.pre\u execute(context=kwargs)
import\u orders\u products\u op.execute(context=kwargs)之前设置您加载的字符串

我得到错误:TypeError:pre\u execute()获取了一个意外的关键字参数'next_execution_date'@Programmer120抱歉,我不确定如何在上下文中传递。鉴于python callable应该获得一个单独的参数'context',这是一个dict,如果您创建可调用的签名
**kwargs
,那么所有的dict密钥对都将位于
kwargs
,我认为这是您应该做的将
context
分配给@dlamblin知道我们为什么需要pre_execute()?我们不能直接使用execute()吗?@Programmer120使用execute()时,我无法呈现模板有任何帮助吗?