我想从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...
答案 0 :(得分:0)
UI非常适合检查是否已写入XCom,我甚至建议您在尝试在单独的任务中引用它之前执行此操作,因此您无需担心是否要获取正确与否。单击您的create_tmp_big_query_table
任务->任务实例详细信息-> XCom。看起来类似于以下内容:
在您的情况下,代码对我而言似乎正确,但是我猜您的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