Google bigquery 使用xcom从BigQueryOperator获取正在运行的作业id
我想从BigQueryOperator获取Bigquery的作业id 我在bigquery_operator.py文件中看到了以下行:Google bigquery 使用xcom从BigQueryOperator获取正在运行的作业id,google-bigquery,airflow,Google Bigquery,Airflow,我想从BigQueryOperator获取Bigquery的作业id 我在bigquery_operator.py文件中看到了以下行: context['task_instance'].xcom_push(key='job_id', value=job_id) 我不知道这是airflow的作业id还是BigQuery作业id,如果是BigQuery作业id,我如何使用xcom从下游任务中获取它 我试着在下游的Pythonoperator中执行以下操作: def write_statistics
context['task_instance'].xcom_push(key='job_id', value=job_id)
我不知道这是airflow的作业id还是BigQuery作业id,如果是BigQuery作业id,我如何使用xcom从下游任务中获取它
我试着在下游的Pythonoperator中执行以下操作:
def write_statistics(**kwargs):
job_id = kwargs['templates_dict']['job_id']
print('tamir')
print(kwargs['ti'].xcom_pull(task_ids='create_tmp_big_query_table',key='job_id'))
print(kwargs['ti'])
print(job_id)
t3 = BigQueryOperator(
task_id='create_tmp_big_query_table',
bigquery_conn_id='bigquery_default',
destination_dataset_table= DATASET_TABLE_NAME,
use_legacy_sql=False,
write_disposition='WRITE_TRUNCATE',
sql = """
#standardSQL...
UI非常适合于检查XCom是否被写入,我建议您在尝试在单独的任务中引用它之前就这样做,这样您就不必担心是否正确获取它。单击您的
create\u tmp\u big\u query\u表
task->task Instance Details->XCom。它的外观如下所示:
在您的情况下,代码对我来说是正确的,但我猜您的Airflow版本没有将保存作业id添加到XCom中的更改。此功能是在中添加的,目前仅在master
上,而不是最新稳定版本(1.10.3)的一部分。请参见1.10.3版的
您的选择是等待它进入发行版(…有时需要一段时间),运行带有该更改的
master
版本,或作为自定义运算符临时复制较新版本的运算符。在最后一种情况下,我建议将其命名为BigQueryOperator WithXCOM
,并在发布后用内置操作符替换它。bigquery\u operator.py中的作业ID是BQ作业ID。查看前面几行,您可以理解它:
if isinstance(self.sql, str):
job_id = self.bq_cursor.run_query(
sql=self.sql,
destination_dataset_table=self.destination_dataset_table,
write_disposition=self.write_disposition,
allow_large_results=self.allow_large_results,
flatten_results=self.flatten_results,
udf_config=self.udf_config,
maximum_billing_tier=self.maximum_billing_tier,
maximum_bytes_billed=self.maximum_bytes_billed,
create_disposition=self.create_disposition,
query_params=self.query_params,
labels=self.labels,
schema_update_options=self.schema_update_options,
priority=self.priority,
time_partitioning=self.time_partitioning,
api_resource_configs=self.api_resource_configs,
cluster_fields=self.cluster_fields,
encryption_configuration=self.encryption_configuration
)
elif isinstance(self.sql, Iterable):
job_id = [
self.bq_cursor.run_query(
sql=s,
destination_dataset_table=self.destination_dataset_table,
write_disposition=self.write_disposition,
allow_large_results=self.allow_large_results,
flatten_results=self.flatten_results,
udf_config=self.udf_config,
maximum_billing_tier=self.maximum_billing_tier,
maximum_bytes_billed=self.maximum_bytes_billed,
create_disposition=self.create_disposition,
query_params=self.query_params,
labels=self.labels,
schema_update_options=self.schema_update_options,
priority=self.priority,
time_partitioning=self.time_partitioning,
api_resource_configs=self.api_resource_configs,
cluster_fields=self.cluster_fields,
encryption_configuration=self.encryption_configuration
)
for s in self.sql]
最后,run_with_configuration方法从BQ返回self.running_job_id