如何分发BigQueryML任务以适配Cloud Natural Language API配额限制?
解决BigQuery调用Cloud Natural Language API请求超限的方案
针对60万行数据触发API 429请求超限的问题,可通过以下几种方式分发任务:
分批手动执行查询
按数据的id、时间戳等字段拆分查询范围,每次处理一部分数据,批次大小控制在600条以内(匹配API每分钟配额),每批次间隔1分钟以上执行。示例:-- 处理第一批次数据 SELECT id, text_content, ml_understand_text_result, FLOAT64(ml_understand_text_result.document_sentiment.score) AS score, FLOAT64(ml_understand_text_result.document_sentiment.magnitude) AS magnitude, FROM ML.UNDERSTAND_TEXT( MODEL `{PROJECT_ID}.{DATASET_ID}.{NLP_MODEL_NAME}`, (SELECT id, content as text_content FROM table_a WHERE id BETWEEN 1 AND 600), STRUCT("analyze_sentiment" AS nlu_option)) ;依次调整WHERE条件的id范围,完成所有数据的处理。
用BigQuery脚本自动分批调度
编写循环脚本,自动拆分批次并加入延迟,避免触发配额限制。需要先创建结果表存储每批次输出:-- 初始化变量 DECLARE batch_size INT64 DEFAULT 600; DECLARE current_offset INT64 DEFAULT 0; DECLARE total_rows INT64; -- 获取总数据量 SELECT COUNT(*) INTO total_rows FROM table_a; -- 循环处理所有批次 WHILE current_offset < total_rows DO INSERT INTO processed_sentiment_results (id, text_content, score, magnitude) SELECT id, text_content, FLOAT64(ml_understand_text_result.document_sentiment.score) AS score, FLOAT64(ml_understand_text_result.document_sentiment.magnitude) AS magnitude, FROM ML.UNDERSTAND_TEXT( MODEL `{PROJECT_ID}.{DATASET_ID}.{NLP_MODEL_NAME}`, (SELECT id, content as text_content FROM table_a LIMIT batch_size OFFSET current_offset), STRUCT("analyze_sentiment" AS nlu_option)) ; -- 等待60秒,匹配API配额周期 EXECUTE IMMEDIATE "SELECT SLEEP(60)"; SET current_offset = current_offset + batch_size; END WHILE;请求提升API配额
如果长期需要处理大规模数据,可通过GCP控制台提交Cloud Natural Language API的配额提升申请,说明业务需求场景,申请更高的每分钟请求限额,从根源解决超限问题。尝试API批量请求优化
确认ML.UNDERSTAND_TEXT是否支持将多条文本打包为单个API请求(部分NLP API支持批量处理),若支持,可调整查询逻辑,将多条数据合并为单个请求的输入,减少总请求次数。
内容的提问来源于stack exchange,提问作者elaamrani
相关产品推荐
相关产品推荐

