Javascript 如何在每个请求中将bigquery响应分为10000个部分?
我有bigqueryJavascript 如何在每个请求中将bigquery响应分为10000个部分?,javascript,node.js,google-bigquery,Javascript,Node.js,Google Bigquery,我有bigquery“选择visitorId,totals.visions FROM[12123333.ga_sessions\u 20160602]”,它在一个请求中返回500k行 但是我想在一个请求中将数据从1到10000行进行分段,在下一个请求中,下一个10001到20000行将被提取,以此类推 提前感谢。一个选项是将查询结果写入目标表,然后使用API以分页方式从该表中检索数据,可以使用maxResults和pageToken逐页检索,也可以使用maxResults和startIndex检
“选择visitorId,totals.visions FROM[12123333.ga_sessions\u 20160602]”
,它在一个请求中返回500k行
但是我想在一个请求中将数据从1到10000行进行分段,在下一个请求中,下一个10001到20000行将被提取,以此类推
提前感谢。一个选项是将查询结果写入目标表,然后使用API以分页方式从该表中检索数据,可以使用
maxResults
和pageToken
逐页检索,也可以使用maxResults
和startIndex
检索指定的行集
另一个选项是将行号添加到查询中(如下所示)
仍然将结果写入目标临时表,然后使用新的num
字段从该表中检索数据,例如分组为num%10000={group_number}
。或者您可以使用INTEGER(num/10000)={group\u number}
——您更喜欢的任何选项
SELECT visitorId , totals.visits
FROM tempTable
WHERE num % 10000 = 0
下一步将与
WHERE num % 10000 = 1
等等
请注意:
第二个选项使用昂贵的(执行方面-而非计费方面)ROW_NUMBER()函数,该函数要求每个分区的所有数据(在本例中,只有一个分区-所有行)位于同一节点中,因此取决于它可以工作或不工作的行数。对于仅包含500K行的特定示例,它将起作用,但如果将其扩展到包含数百万行的表,则可能不会起作用(取决于每行中输出的数据量和行数)
还有一个注意事项:-在第一个选项中,当您生成结果并将其保存到临时表中时,您只需支付一次。然后-从某种意义上说,Tabledata.list API是免费的,因为它本身不使用BigQuery查询,而只是直接从底层数据读取数据。
-在第二个选项中,当您每次检索/查询另一个组时生成临时表和时,您都要支付这两项费用,因为这都是BigQuery查询。此外,每次你们获得特定组的数据时——你们要为扫描整个临时表付费——所以在你们的情况下,这是额外的50倍
这使得(在你的情况下)第一个选项大约比第二个选项便宜51倍:o)一个选项是将查询结果写入目标表,然后使用API以分页方式从该表中检索数据,可以使用
maxResults
和pageToken
逐页检索,或者maxResults
和startIndex
检索指定的行集
另一个选项是将行号添加到查询中(如下所示)
仍然将结果写入目标临时表,然后使用新的num
字段从该表中检索数据,例如分组为num%10000={group_number}
。或者您可以使用INTEGER(num/10000)={group\u number}
——您更喜欢的任何选项
SELECT visitorId , totals.visits
FROM tempTable
WHERE num % 10000 = 0
下一步将与
WHERE num % 10000 = 1
等等
请注意:
第二个选项使用昂贵的(执行方面-而非计费方面)ROW_NUMBER()函数,该函数要求每个分区的所有数据(在本例中,只有一个分区-所有行)位于同一节点中,因此取决于它可以工作或不工作的行数。对于仅包含500K行的特定示例,它将起作用,但如果将其扩展到包含数百万行的表,则可能不会起作用(取决于每行中输出的数据量和行数)
还有一个注意事项:-在第一个选项中,当您生成结果并将其保存到临时表中时,您只需支付一次。然后-从某种意义上说,Tabledata.list API是免费的,因为它本身不使用BigQuery查询,而只是直接从底层数据读取数据。
-在第二个选项中,当您每次检索/查询另一个组时生成临时表和时,您都要支付这两项费用,因为这都是BigQuery查询。此外,每次你们获得特定组的数据时——你们要为扫描整个临时表付费——所以在你们的情况下,这是额外的50倍
这使得(在您的情况下)第一个选项比第二个选项便宜大约51倍:o)听起来您要求数据分页,其中页面大小为10000, 您可以使用以下查询
SELECT visitorId, totals.visits,
FROM (
SELECT visitorId , totals.visits, ROW_NUMBER() OVER() as rownum
FROM [12123333.ga_sessions_20160602]'
) WHERE rownum BETWEEN 1 AND 10000
等等
SELECT visitorId, totals.visits,
FROM (
SELECT visitorId , totals.visits, ROW_NUMBER() OVER() as rownum
FROM [12123333.ga_sessions_20160602]'
) WHERE rownum BETWEEN 10001 AND 20000
听起来像是要求数据分页,其中页面大小为10000, 您可以使用以下查询
SELECT visitorId, totals.visits,
FROM (
SELECT visitorId , totals.visits, ROW_NUMBER() OVER() as rownum
FROM [12123333.ga_sessions_20160602]'
) WHERE rownum BETWEEN 1 AND 10000
等等
SELECT visitorId, totals.visits,
FROM (
SELECT visitorId , totals.visits, ROW_NUMBER() OVER() as rownum
FROM [12123333.ga_sessions_20160602]'
) WHERE rownum BETWEEN 10001 AND 20000