【问题标题】:How do I limit the number of jobs in Google Bigquery [closed]如何限制 Google Bigquery 中的作业数量 [关闭]
【发布时间】:2025-12-05 13:50:01
【问题描述】:
为了更好地了解我们的 CRM (ActiveCampaign) 中发生的情况并创建我们自己的报告,我现在使用 webhook 和 Google Apps 脚本将所有更改发布到 BigQuery 数据库。
这很好用,但是我发现有 1000 个加载作业的限制,并且 CRM 中的每次更改都会创建至少一个,有时甚至更多的加载作业。此限制不能以任何方式增加。所以我正在寻找一种方法来批处理条目并每 10 分钟加载一次。
但是,我不知道如何在由 webhook 触发的 Apps 脚本中创建它,而且我在网上的任何地方都找不到它。有人有建议吗?
【问题讨论】:
-
我认为 App Engine 中的 Cron 作业、Apache Airflow、Oozie 和 Web 服务(如 here 所述)是限制 BigQuery 作业数量的一些不错的选择。
标签:
javascript
sql
google-apps-script
google-bigquery
【解决方案1】:
您可以通过在初始 webhook 中将事件序列化到数据存储设备(如 Google 表格)中,然后使用基于时间的触发器来读取保存的事件并将其发送到 BigQuery,从而为您的事件处理添加时间延迟。
function doPost(e) {
var hdd = SpreadsheetApp.openById("some id");
/* Pick the sheet to log to based on parameters of the event */
var params = e.parameters, sector = "";
if(...) {
sector = "some sheet name";
} else if(...) {
sector = "some other sheet name"
}
... // Do other stuff with event that needs immediate handling.
// Serialize for batch processing later.
hdd.getSheetByName(sector).appendRow([JSON.stringify(e)]);
}
// Fire events in bulk. Create a time based trigger to call this function every so often.
function refireEvents() {
var sectors = SpreadsheetApp.openById("some id").getSheets();
for(var i = 0; i < sectors.length; ++i) {
var events = sectors[i].getDataRange().getValues();
var sheetName = sectors[i].getName();
for(var r = 0; r < events.length; ++r) {
var event = JSON.parse(events[r][0]); // Assuming only single column of data
/* Do stuff with the event response that was originally done in the webhook */
}
// Remove handled events.
sectors[i].clearContent();
}
}