使用xcom从BigQueryOperator获取正在运行的作业ID

时间:2019-06-20 10:01:52

标签: google-bigquery airflow

我想从BigQueryOperator获取Bigquery的工作ID。

我在bigquery_operator.py文件中看到以下行:

context['task_instance'].xcom_push(key='job_id', value=job_id)

我不知道这是气流的作业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...

2 个答案:

答案 0 :(得分:0)

UI非常适合检查是否已写入XCom,我甚至建议您在尝试在单独的任务中引用它之前执行此操作,因此您无需担心是否要获取正确与否。单击您的create_tmp_big_query_table任务->任务实例详细信息-> XCom。看起来类似于以下内容:

xcom page

在您的情况下,代码对我而言似乎正确,但是我猜您的Airflow版本没有进行更改,该更改将保存作业ID添加到XCom中。此功能已添加到https://github.com/apache/airflow/pull/5195中,该功能当前仅在master上,并且不属于最新的稳定版本(1.10.3)。自己查看BigQueryOperator的1.10.3版本。

您的选择是等待发布(有时需要一段时间),运行带有该更改的master版本,或暂时复制较新版本的运算符。自定义运算符。在最后一种情况下,建议将其命名为BigQueryOperatorWithXcom并加一个注释,以便在发布后将其替换为内置运算符。

答案 1 :(得分:0)

bigquery_operator.py中的JOB ID是BQ JOB 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