使用 Node 流式传输大型大查询 SELECT?

Posted

技术标签:

【中文标题】使用 Node 流式传输大型大查询 SELECT?【英文标题】:Stream a large Big-query SELECT with Node? 【发布时间】: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。 【参考方案1】:

我认为这可能是您需要的:

https://googleapis.dev/nodejs/bigquery/latest/BigQuery.html#createQueryStream

该函数允许您构建查询并通过数据流使用它。

【讨论】:

【参考方案2】:

正如人们所指出的,最好能在 Bigquery SQL 语句中处理所有内容。

但是,如果您必须在应用程序中处理数据。 Bigquery 提供了一个 tabledata.list API 来直接从表中读取数据。

https://cloud.google.com/bigquery/docs/reference/rest/v2/tabledata/list

【讨论】:

谢谢。但我不知道这个 API 的定价是如何计算的?我们只支付读取的行数? Tabledata.list API 是免费的。 但是表List一次性返回所有数据库分区?所以 280 去,不是吗?在服务器端处理和处理并不容易。【参考方案3】:

最后,我只是使用 BigQuery Legacy SQL 装饰器来仅选择我需要的时间间隔。所以,我不能得到我的大桌子的一部分,只为这一部分付费。

https://cloud.google.com/bigquery/table-decorators

但请注意,您只能对最近 7 天的数据使用装饰器!

【讨论】:

以上是关于使用 Node 流式传输大型大查询 SELECT?的主要内容,如果未能解决你的问题,请参考以下文章

哪个 iOS 音频 API 设计用于以低延迟从磁盘流式传输大型本地音频文件?

排序时流式传输大数据

Impala 通过 JDBC 流式传输真的很慢

在 java servlet 中流式传输大文件

将文件解压缩到内存中,调整文件,压缩并流式传输到客户端(Node.js)

如何使用 createWriteStream 将 JSON 流式传输到 BigQuery 表?