如何使用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()时,我无法呈现模板有任何帮助吗?