Google bigquery 使用xcom从BigQueryOperator获取正在运行的作业id

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

我想从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(**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