Google bigquery 有没有办法在bigquery中使用动态数据集名称

Google bigquery 有没有办法在bigquery中使用动态数据集名称,google-bigquery,airflow,Google Bigquery,Airflow,问题陈述: 我试图在气流中使用BigqueryOperator。其目的是通过动态更改数据集名称来多次读取相同的查询,即数据集名称将作为参数传递 例如: project.dataset1\u layer1.tablename1,project.dataset2\u layer1.tablename1 期望值: 我想维护一个SQL副本,在其中我可以将数据集名称作为参数传递,这些参数可以替换为特定的数据集 错误消息: 我尝试将动态数据集名称作为查询参数的一部分传递。但它失败了,并显示以下错误消息 查询

问题陈述:

我试图在气流中使用BigqueryOperator。其目的是通过动态更改数据集名称来多次读取相同的查询,即数据集名称将作为参数传递

例如:
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'}
`

到目前为止我尝试过的事情

查询Temaplate
temp.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字符串替换