Google bigquery 有没有办法在bigquery中使用动态数据集名称
问题陈述: 我试图在气流中使用BigqueryOperator。其目的是通过动态更改数据集名称来多次读取相同的查询,即数据集名称将作为参数传递 例如:Google bigquery 有没有办法在bigquery中使用动态数据集名称,google-bigquery,airflow,Google Bigquery,Airflow,问题陈述: 我试图在气流中使用BigqueryOperator。其目的是通过动态更改数据集名称来多次读取相同的查询,即数据集名称将作为参数传递 例如: project.dataset1\u layer1.tablename1,project.dataset2\u layer1.tablename1 期望值: 我想维护一个SQL副本,在其中我可以将数据集名称作为参数传递,这些参数可以替换为特定的数据集 错误消息: 我尝试将动态数据集名称作为查询参数的一部分传递。但它失败了,并显示以下错误消息 查询
project.dataset1\u layer1.tablename1
,project.dataset2\u layer1.tablename1
期望值:
我想维护一个SQL副本,在其中我可以将数据集名称作为参数传递,这些参数可以替换为特定的数据集
错误消息:
我尝试将动态数据集名称作为查询参数的一部分传递。但它失败了,并显示以下错误消息
查询被解析为
INFO-正在执行:[u'从项目中选择col1、col2.@partner\u layer1.tablename']
错误-BigQuery作业失败。最后一个错误是:{u'reason':u'invalidQuery',u'message':u'Query参数不能用来代替[1:37]',u'location':u'Query'}处的表名。u'CREATE_IF_NEEDED',u'query':u'SELECT col1,col2 FROM project.@partner\u layer1.tablename'},u'jobType':u'query'}
`
到目前为止我尝试过的事情
查询Temaplatetemp.sql
如下:
SELECT col1, col2 FROM `project.@partner_layer1.tablename`;
query_template_dict = {
'partner_list' = ['val1', 'val2', 'val3', 'val4']
'google_project': 'project_name',
'queries': {
'layer3': {
'template': 'temp.sql',
'output_dataset': '_layer3',
'output_tbl': 'table_{}'.format(table_date),
'output_tbl_schema': 'temp.txt'
}
},
'applicable_tasks': {
'val1': {
'table_layer3': []
},
'val2': {
'table_layer3': []
},
'val3': {
'table_layer3': []
},
'val4': {
'table_layer3': []
}
}
}
for partner in query_template_dict['partner_list']:
# Loop over applicable report queries for a partner
applicable_tasks = query_template_dict['applicable_tasks'][partner].keys()
for task in applicable_tasks:
destination_tbl = '{}.{}{}.{}'.format(query_template_dict['google_project'], partner,
query_template_dict['queries'][task]['output_dataset'] ,
query_template_dict['queries'][task]['output_tbl'])
}
#Actual destination table structure
#destination_tbl = 'project.partner_layer3.table_20200223'
run_bq_cmd = BigQueryOperator (
task_id =partner + '-' + task,
sql =[query_template_dict['queries'][task]['template']],
destination_dataset_table =destination_tbl,
use_legacy_sql =False,
write_disposition ='WRITE_APPEND',
create_disposition ='CREATE_IF_NEEDED',
allow_large_results =True,
query_params=[
{
"name": "partner",
"parameterType": { "type": "STRING" },
"parameterValue": { "value": partner}
},
{
"name": "batch_date",
"parameterType": { "type": "STRING" },
"parameterValue": { "value": batch_date}
}
],
dag=dag,
气流BigqueryOperator的使用方法如下:
SELECT col1, col2 FROM `project.@partner_layer1.tablename`;
query_template_dict = {
'partner_list' = ['val1', 'val2', 'val3', 'val4']
'google_project': 'project_name',
'queries': {
'layer3': {
'template': 'temp.sql',
'output_dataset': '_layer3',
'output_tbl': 'table_{}'.format(table_date),
'output_tbl_schema': 'temp.txt'
}
},
'applicable_tasks': {
'val1': {
'table_layer3': []
},
'val2': {
'table_layer3': []
},
'val3': {
'table_layer3': []
},
'val4': {
'table_layer3': []
}
}
}
for partner in query_template_dict['partner_list']:
# Loop over applicable report queries for a partner
applicable_tasks = query_template_dict['applicable_tasks'][partner].keys()
for task in applicable_tasks:
destination_tbl = '{}.{}{}.{}'.format(query_template_dict['google_project'], partner,
query_template_dict['queries'][task]['output_dataset'] ,
query_template_dict['queries'][task]['output_tbl'])
}
#Actual destination table structure
#destination_tbl = 'project.partner_layer3.table_20200223'
run_bq_cmd = BigQueryOperator (
task_id =partner + '-' + task,
sql =[query_template_dict['queries'][task]['template']],
destination_dataset_table =destination_tbl,
use_legacy_sql =False,
write_disposition ='WRITE_APPEND',
create_disposition ='CREATE_IF_NEEDED',
allow_large_results =True,
query_params=[
{
"name": "partner",
"parameterType": { "type": "STRING" },
"parameterValue": { "value": partner}
},
{
"name": "batch_date",
"parameterType": { "type": "STRING" },
"parameterValue": { "value": batch_date}
}
],
dag=dag,
有人能帮我解决这个问题吗?
BigQuery中是否有动态传递数据集名称的限制?在Airflow中替换数据集名称,而不是在BigQuery中
因此,在将查询发送到BigQuery之前,请执行此操作-在Airflow中使用Python字符串替换。在Airflow中替换数据集名称,而不是在BigQuery中 因此,在将查询发送到BigQuery之前,请执行此操作—在内部使用Python字符串替换