BigQuery批量更新列描述触发Exceeded rate limits报错咨询
BigQuery批量更新列描述触发表更新速率限制解决方案
问题根因
当前采用单条SQL仅更新1个列描述的执行方式,1500个列对应1500次表元数据修改操作,会触发BigQuery默认的单表更新速率配额:单张表每10秒窗口内最多允许5次表修改类操作,短时间集中提交就会报限流错误。
最优方案:合并同表多列更新到单条SQL
这是效率最高、完全规避限流的方案,BigQuery的ALTER TABLE语法支持单条语句携带多个ALTER COLUMN子句,你可以把同一张表下所有需要更新描述的列,全部写到同一条ALTER语句中执行,单张表仅需1次操作,50张表总计仅需执行50条SQL,操作量直接降低97%,完全在默认配额范围内。
示例执行命令:
bq query --nouse_legacy_sql \ 'ALTER TABLE `你的项目ID.你的数据集名.表名` ALTER COLUMN 列名1 SET OPTIONS(DESCRIPTION="列1的更新后描述"), ALTER COLUMN 列名2 SET OPTIONS(DESCRIPTION="列2的更新后描述"), ALTER COLUMN 列名3 SET OPTIONS(DESCRIPTION="列3的更新后描述"), -- 追加该表下所有需要更新描述的列即可 ALTER COLUMN 列名N SET OPTIONS(DESCRIPTION="列N的更新后描述");'
注意:BigQuery单条SQL长度上限约为10MB,哪怕单张表有上百个列,所有描述拼接后也远达不到长度上限,不需要担心语句超长问题。
备选方案:执行流控+自动重试
如果受场景限制无法合并语句,可以通过执行节奏控制+内置重试规避限流:
- 不要一次性批量提交所有命令,采用串行方式执行,每执行完1条命令后休眠1~2秒再执行下一条
- 给bq命令增加
--max_retries=3参数,触发限流时CLI会自动按指数退避规则重试,无需手动编写重试逻辑 - 同一张表的更新操作不要连续集中提交,可以穿插不同表的更新操作,避免单表短时间内操作数超限
示例命令:
# 带自动重试的串行执行示例 bq query --nouse_legacy_sql --max_retries=3 \ 'ALTER TABLE `proj.ds.table1` ALTER COLUMN col1 SET OPTIONS(DESCRIPTION="新描述")' sleep 2 bq query --nouse_legacy_sql --max_retries=3 \ 'ALTER TABLE `proj.ds.table2` ALTER COLUMN col_a SET OPTIONS(DESCRIPTION="新描述")' sleep 2
避坑提示
禁止并发提交所有更新语句,哪怕总操作数不高,并发提交也容易瞬间打满单表10秒窗口的操作配额,触发限流。
内容的提问来源于stack exchange,提问作者RaptorX
相关产品推荐
相关产品推荐

