这是我的接线员:
bigquery_check_op = BigQueryOperator(
task_id='bigquery_check',
bql=SQL_QUERY,
use_legacy_sql = False,
bigquery_conn_id=CONNECTION_ID,
trigger_rule='all_success',
xcom_push=True,
dag=dag
)
当我在UI中检查“渲染”页面时。什么都没有出现。
当我在控制台中运行SQL时,它返回正确的值1400
。
为什么操作员不按下XCOM?
我不能使用BigQueryValueCheckOperator
。该运算符旨在对值进行检查失败。我不想失败。我只是想根据查询的返回值来分支代码。
答案 0 :(得分:1)
最简单的答案是因为xcom_push
既不是BigQueryOperator
也不是BaseOperator
也不是LoggingMixin的参数之一。
BigQueryGetDataOperator
确实返回(并推入了)某些数据,但是它按表名和列名工作。您可以通过将查询运行到一个唯一命名的表(可能使用名称中的{{ds_nodash}}
),然后将表用作此运算符的源,然后然后您可以使用BranchPythonOperator
进行分支。
您可以尝试使用BigQueryHook
的{{3}}来运行查询并在BranchPythonOperator
内 中处理一些数据。
我们在其他地方聊天,并提出了一些类似的方法,以放入BranchPythonOperator
的可调用项:
cursor = BigQueryHook(bigquery_conn_id='connection_name').get_conn().cursor()
# one of these two:
cursor.execute(SQL_QUERY) # if non-legacy
cursor.job_id = cursor.run_query(bql=SQL_QUERY, use_legacy_sql=False) # if legacy
result=cursor.fetchone()
return "task_one" if result[0] is 1400 else "task_two" # depends on results format
答案 1 :(得分:0)
以下是使用BigQueryHook和BranchPythonOperator来完成此操作的方法:
from airflow.operators.python_operator import BranchPythonOperator
from airflow.contrib.hooks import BigQueryHook
def big_query_check(**context):
sql = context['templates_dict']['sql']
bq = BigQueryHook(bigquery_conn_id='default_gcp_connection_id',
use_legacy_sql=False)
conn = bq.get_conn()
cursor = conn.cursor()
results = cursor.execute(sql)
# Do something with results, return task_id to branch to
if results = 0:
return "task_a"
else:
return "task_b"
sql = "SELECT COUNT(*) FROM sales"
branching = BranchPythonOperator(
task_id='branching',
python_callable=big_query_check,
provide_context= True,
templates_dict = {"sql": sql}
dag=dag,
)
首先,我们创建一个可调用的python,可用于执行查询并选择要分支的task_id。其次,我们创建BranchPythonOperator。