如何使用 node.js 客户端库计算完成的 BigQuery 作业的行数
Posted
技术标签:
【中文标题】如何使用 node.js 客户端库计算完成的 BigQuery 作业的行数【英文标题】:How to count rows of finished BigQuery job using node.js client library 【发布时间】:2017-07-21 06:24:04 【问题描述】:我想获取运行的作业的行数:
bigquery.startQuery(options)
这样做的幼稚方法是流式传输结果(例如使用):
job.getQueryResultsStream()
并一一数一数。这显然不是很有效,尤其是对于大型结果。我想到的另一种方法是使用作业的元数据:
job.on('complete', function(metadata) ...
我可以对响应进行“逆向工程”,以获取查询计划,并查看最后一步中写入的行数。我可以在以下位置找到:
statistics.query.queryPlan[statistics.query.queryPlan.length - 1].recordsWritten
虽然不同查询的样本使我确信这可能有效,但感觉就像是“黑客”,很难说它有多强大。似乎我可能需要处理不同的情况(查询失败等)
编辑:下面建议的另一个选项是“选择计数”由原始查询创建的临时表(在作业元数据中可用)。虽然这绝对是获得我正在寻找的结果的一种直接方法,但它的缺点是需要另一个往返来查询 BigQuery 服务,这需要几秒钟的时间。这是一个 0“字节计费”的查询(计算一个完整的表只使用表元数据),但当作业“知道”它已写入输出的行数时,它似乎是多余的。
是否有一种直接且“正确”的方法可以从作业对象中获取此计数,而无需往返 BQ 服务?可能是我遗漏/误解的字段,或者作业对象中返回 this 的函数?
【问题讨论】:
为什么要投反对票? 【参考方案1】:任何作业都有目标表 - 即使您没有明确设置它 - 结果仍保存在所谓的匿名表中,您可以依次查询以获取输出行数。所以下面简单的额外查询将起作用(注意 - 名称仅作为示例)
SELECT COUNT(1)
FROM `yourProject._0511743a77ca76c1b55482d7cb1f8e91ac5c7b36.anon17286defe54b5c07ba6810a71abfdba6388ac4e0`
要使用的实际目标表 - 可以从作业的configuration.query.destinationTable 属性中检索
【讨论】:
这可以正常工作,但与在查询计划中窥视相比,它的缺点是需要往返 BQ 服务(这将花费几秒钟)。我已编辑问题以反映这一点。 真的。再打一个电话。仍然是返回 100% 正确结果的选项! :o) 如果您喜欢,请考虑投票【参考方案2】: job.on('complete', function(metadata)
console.log(metadata.statistics.query.numDmlAffectedRows)
【讨论】:
您能详细说明一下吗?以上是关于如何使用 node.js 客户端库计算完成的 BigQuery 作业的行数的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Google API 服务库 (Node.js) 运行 Google 应用脚本
使用 Node.js 客户端库将查询参数添加到 mailchimp 请求