javascript - 如何在每个请求中将bigquery响应分段为10000?

标签 javascript node.js google-bigquery

我有一个 bigquery 'SELECT VisitorId , Totals.visits FROM [12123333.ga_sessions_20160602]',它在一个请求中返回 500k 行。

但我想在一个请求中将数据从 1 到 10,000 行进行分段,并在下一个请求中,接下来的 10,001 到 20,000 行将被获取,依此类推。

提前致谢。

最佳答案

一个选项是将查询结果写入目标表,然后使用 Tabledata: list API 以分页方式从该表中检索数据,可以使用 maxResultspageToken 逐页检索,也可以使用 maxResultsstartIndex 检索指定的行集。

另一个选项是将 row_number 添加到您的查询中(如下所示)

SELECT visitorId , totals.visits,  
  ROW_NUMBER() OVER() as num
FROM [12123333.ga_sessions_20160602]

仍然将结果写入目标临时表,然后使用新的 num 字段从该表中检索数据,进行分组,例如 num % 10000 = {group_number} 。或者您可以使用INTEGER(num/10000) = {group_number} - 无论您更喜欢什么

SELECT visitorId , totals.visits 
FROM tempTable
WHERE num % 10000 = 0 

接下来将是

WHERE num % 10000 = 1 

等等...

请注意: 第二个选项使用昂贵的(执行方面 - 而非计费方面)ROW_NUMBER() 函数,该函数要求每个分区的所有数据(在本例中它只是一个分区 - 所有行)位于同一 Node 中 -所以取决于它可以工作或不工作的行数。对于只有 500K 行的特定示例,它可以工作 - 但如果将其扩展到具有数百万行的表 - 它可能不会(取决于每行输出的数据量和行数)

还有一点:
- 在第一个选项中,当您生成结果并将其保存到临时表中时,您只需支付一次。然后 - 从某种意义上说,它是免费的,Tabledata.list API 可以免费使用,因为它本身不使用 BigQuery 查询,而只是直接从底层数据读取。
- 在第二个选项中,您需要支付两者费用 - 并且当您每次检索/查询另一个组时生成临时表时 - 因为它都是 BigQuery 查询。此外,每次您获取特定组的数据时 - 您需要扫描整个临时表 - 所以在您的情况下,它是额外的 50 次

这使得(在您的情况下)第一个选项比第二个选项便宜大约 51 倍:o)

关于javascript - 如何在每个请求中将bigquery响应分段为10000?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39424391/

相关文章:

c++ - npm 安装 : fatal error C1083 on bson and kerberos compilation 上的 node-gyp 错误

arrays - BigQuery标准SQL:如何按ARRAY字段分组

mysql - 如何在Bigquery中查询自动日期?

javascript - 当元素没有设置类名时的 DOM HTMLElement className 属性

javascript - 一天中几秒的新 JavaScript 日期对象

javascript - 在 CSS 转换上卡顿

node.js 回调、嵌套函数、如何重构

javascript - 使用 Node JS 保存 AR-Drone 2.0 视频流

python - Spark 读取 BigQuery 外部表

javascript - 类型错误 :is not a constructor