我有一个 bigquery 'SELECT VisitorId , Totals.visits FROM [12123333.ga_sessions_20160602]'
,它在一个请求中返回 500k 行。
但我想在一个请求中将数据从 1 到 10,000 行进行分段,并在下一个请求中,接下来的 10,001 到 20,000 行将被获取,依此类推。
提前致谢。
最佳答案
一个选项是将查询结果写入目标表,然后使用 Tabledata: list API 以分页方式从该表中检索数据,可以使用 maxResults
和 pageToken
逐页检索,也可以使用 maxResults
和 startIndex
检索指定的行集。
另一个选项是将 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/