我有以下代码:
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
计算MySqlToGoogleCloudStorageOperator
所需的运行次数,并创建SQL的WHERE
集群,然后需要执行它。
问题是MySqlToGoogleCloudStorageOperator
未被执行。
我实际上不能做
chunck_import_op >> import_orders_products_op
如何使MySqlToGoogleCloudStorageOperator
在PythonOperator
内部执行?
答案 0 :(得分:1)
我认为在您的for循环结束时,您可能想调用import_orders_products_op.execute(context=kwargs)
,然后再调用import_orders_products_op.pre_execute(context=kwargs)
。这有点复杂,因为它跳过了render_templates()
的{{1}}调用,并且实际上,如果您改为使用task_instance
来放置所有这些任务,则可以调用{{1 }}或task_instance
代替,但它们都需要来自dagrun的信息(您可以在python可调用对象的上下文中,例如run
中获得这些信息)
查看传递给运算符的内容,就像原样一样,您需要模板化步骤来加载_raw_run_task
文件并填写kwargs['dag_run']
参数。另外,也可以在可调用函数本身中将文件加载到字符串中,在没有Jinja2的情况下手动替换import_orders.sql
部分(及其他任何部分)(或者您可以花时间找出正确的jinja2调用),然后设置WHERE
,然后再调用{{ params.WHERE }}
和import_orders_products_op.sql=the_string_you_loaded
。