【发布时间】:2018-01-15 17:30:53
【问题描述】:
我正在开发一个 Node.js 程序。我们每天都使用 Node 来处理存储在 Big Query 中的数据。
每天我们都有大量的新数据 (280 Go)。
如何全天在 BigQuery 上发出请求并逐行传输结果?
现在,我们没有流。我们只需请求一次所有数据。
我可以使用 sql LIMIT 关键字。但问题是 BigQuery 在成本计算中忽略了 LIMIT。如果我们限制 0,10。它探索了当天的所有数据(280 Go)。 LIMIT 10,10 的同上...
这是我当前的代码。
const BigQuery = require('@google-cloud/bigquery');
// ... Some code ...
this.bigQuery
.query(Exporter.enrichQueryWithOptions(`SELECT e.name FROM events))
.then(results => {
const rows = results[0];
console.log(rows);
})
.catch(err => {
console.error('ERROR:', err);
});
【问题讨论】:
-
我不知道 Node,但 BigQuery 的后端响应仍然允许以 "paginated" 方式检索结果,因此您可以利用它。如果您正在处理 280GB 的数据,我建议您使用 apache-beam 或尝试在 BigQuery 本身内进行此操作,否则可能需要几个小时才能运行此作业。
-
谢谢!如何在 Big Query 本身内运行作业?使用谷歌数据流?在我的使用中,我想以不同的方式格式化我的数据并再次将其推送到 BigQuery(以轻量级格式)。并且每天都这样做,或者每天多次处理所有数据......
-
我在 BigQuery 中运行作业的意思是针对它运行查询,该查询已经进行了您计划在 Node 中进行的数据转换(使 BQ 负责该作业而不是 Node)。如果您在 Node 中所做的事情已经可以通过 BQ 中的查询完成,那么这可能是您的用例的最佳方法。另外我忘了提,但目前 Dataflow 仅支持 Java 和 Python 的 SDK,所以不确定这是否适合您。
-
正如@WillianFuks 所指出的,您应该将代码带到数据中,而不是相反。尤其是在这个规模上。您应该使用 SQL 直接在 BigQuery 中转换数据,或者使用 Dataflow。