Google BigQuery跨地域读写错误:源us-east4与目标US不匹配的解决方法
错误原因解释
这个错误是因为BigQuery数据集的位置与存储外部表数据的GCS桶位置不匹配:
- 你的BigQuery数据集
dez-de-404011.zoom位置为US(多区域) - 存储Parquet文件的GCS桶
gs://dtc_data_lake_dez-de-404011位置为us-east4(单区域)
BigQuery执行查询时,默认会用数据集的位置作为查询结果的处理位置,当源数据(GCS)位置和处理位置分属不同区域组时,就会触发"不能在不同位置读写"的限制。
解决办法
提供三种可行方案,按需选择:
方案1:创建同区域数据集并重建外部表
BigQuery数据集创建后无法修改位置,需新建一个位置为us-east4的数据集,再在其中创建外部表:
- 创建新数据集:
CREATE SCHEMA `dez-de-404011.zoom_us_east4` OPTIONS(location='us-east4');
- 在新数据集中创建外部表:
CREATE OR REPLACE EXTERNAL TABLE `dez-de-404011.zoom_us_east4.external_yellow_tripdata` OPTIONS ( format = 'PARQUET', uris = ['gs://dtc_data_lake_dez-de-404011/data/yellow/yellow_tripdata_2021-01.parquet', 'gs://dtc_data_lake_dez-de-404011/data/yellow/yellow_tripdata_2021-02.parquet']);
之后查询新表即可正常执行。
方案2:查询时强制指定处理位置
在查询语句中添加OPTIONS(location='us-east4'),让查询处理位置与GCS桶位置保持一致:
SELECT * FROM `dez-de-404011.zoom.external_yellow_tripdata` OPTIONS(location='us-east4');
方案3:迁移GCS文件到对应区域的桶
如果不想改动数据集或查询逻辑,可以将Parquet文件复制到位置为US的GCS桶中,然后修改外部表的uris参数指向新桶的文件路径。
内容的提问来源于stack exchange,提问作者npkp
相关产品推荐
相关产品推荐

