如何在气流上创建动态字符串

时间:2018-10-04 13:50:18

标签: airflow

我有以下工作流程:

  1. 从MySqlOperator获取编号(动态)
  2. 获取存储在变量(静态)中的值
  3. 基于两者创建一个字符串。
  4. 将字符串用作MySqlToGoogleCloudStorageOperator的sql命令。

现在,事实证明这很困难。

这是我的代码:

VALUE_FROM_VARIABLE = Variable.get("my_var")

query = 'SELECT ... FROM orders where orders_id>{0}
          and orderid<{1};'.format(VALUE_FROM_MySqlOperator, VALUE_FROM_VARIABLE)


file_name   = ...
import_orders_op = MySqlToGoogleCloudStorageOperator(
    task_id='import_orders_and_upload_to_storage',
    mysql_conn_id='mysql_con',
    google_cloud_storage_conn_id='gcp_con',
    sql=query,
    bucket=GCS_BUCKET_ID,
    filename=file_name,
    dag=dag) 

我的问题是我无法访问MySqlOperator XCOM,它存储了查询所需的号码。

因此,我尝试在PythonOperator中访问它,并按如下方式构建查询字符串:

def func(ds, **kwargs):
    ti = kwargs['ti']
    VALUE_FROM_MySqlOperator = str(ti.xcom_pull(task_ids='mySQL_task'))  # get the XCOM of MySqlOperator
    query = 'SELECT ... FROM orders where orders_id>{0}
              and orderid<{1};'.format(VALUE_FROM_MySqlOperator, VALUE_FROM_VARIABLE)
   return query


py_op = PythonOperator(
    task_id='py_op_task',
    provide_context=True,
    python_callable=func,
    xcom_push=True,
    dag=dag)

但是现在我无法将新生成的查询传递给MySqlToGoogleCloudStorageOperator,因为我无法读取此运算符中的XCOM。

我该如何摆脱呢?

1 个答案:

答案 0 :(得分:0)

SQL运算符打算执行不返回任何值的查询。您可以使用此类运算符(例如)将数据从舞台表移至生产环境。

我认为,请避免创建使用XCOMS的工作流。

如果需要从数据库查询数据,可以使用HooksConnections

未经测试的代码在下面

VALUE_FROM_VARIABLE = Variable.get("my_var")
query_to_retrieve = "SELECT item FROM table"
from airflow.hooks.mysql_hook import MySqlHook
#here we importing hook, using connection and get first row
VALUE_FROM_MySQL = MySqlHook(mysql_conn_id='mysql_default').get_first(query_to_retrieve)[0]

query = 'SELECT ... FROM orders where orders_id>{0}
      and orderid<{1};'.format(VALUE_FROM_MySQL, VALUE_FROM_VARIABLE)