要解决BigQuery创建定时查询错误的问题,需要确保目标数据集和传输位于相同的地理位置。如果目标数据集位于JURISDICTION_EU(欧洲地理位置),则传输也必须位于同一地理位置。以下是解决此问题的代码示例:
from google.cloud import bigquery_datatransfer
from google.protobuf.json_format import MessageToDict
project_id = 'your-project-id'
location = 'JURISDICTION_EU' # 目标数据集的地理位置
client = bigquery_datatransfer.DataTransferServiceClient()
# 获取数据集的详细信息
dataset_info = client.get_dataset(project_id, dataset_id)
# 确保数据集的地理位置与传输相同
if dataset_info.location != location:
# 创建传输的配置
transfer_config = {
'destination_dataset_id': dataset_id,
'display_name': 'My Scheduled Query',
'data_source_id': 'scheduled_query',
'params': {
'query': 'SELECT * FROM my_table',
'destination_table_name_template': 'my_table_{run_time|"%Y%m%d"}',
'write_disposition': 'WRITE_TRUNCATE',
'partitioning_field': '',
'destination_encryption_configuration': {},
},
'schedule': 'every 24 hours',
'timezone': 'Europe/London',
}
# 将配置转换为protobuf格式
transfer_config = bigquery_datatransfer.types.TransferConfig(**transfer_config)
transfer_config_dict = MessageToDict(transfer_config)
# 创建传输
transfer = client.create_transfer_config(parent=project_id, transfer_config=transfer_config_dict)
print(f'Scheduled query transfer created: {transfer.name}')
else:
print('The dataset and transfer are in the same location.')
上述代码示例中,首先使用get_dataset
方法获取数据集的详细信息。然后,检查数据集的地理位置是否与预期的地理位置相同。如果不同,就创建传输的配置,并使用create_transfer_config
方法创建传输。
请确保将your-project-id
替换为您的项目ID,dataset_id
替换为目标数据集的ID,以及根据您的需求修改传输的配置。
这样,您就可以解决在JURISDICTION_US中创建传输时的错误,并确保目标数据集和传输位于相同的地理位置。