google-bigquery - 如何使用 node.js 客户端库计算已完成的 BigQuery 作业的行数

标签 google-bigquery

我想获取使用以下方式运行的作业的行数:

bigquery.startQuery(options)

执行此操作的简单方法是流式传输结果(例如使用):

job.getQueryResultsStream()

并一一数。这显然不是很有效,特别是对于大结果而言。我想到的另一种方法是使用作业的元数据:

job.on('complete', function(metadata) {...}

我可以对响应进行“逆向工程”,以获得查询计划,并查看最后一步中写入的行数。我可以在以下位置找到:

statistics.query.queryPlan[statistics.query.queryPlan.length - 1].recordsWritten

虽然不同查询的示例让我相信这可能有效,但感觉就像是“黑客”,而且很难说它有多强大。看来我可能需要处理不同的情况(失败的查询等)

编辑:下面建议的另一个选项是“SELECT COUNT”由原始查询创建的临时表(在作业元数据中可用)。虽然这绝对是获得我正在寻找的结果的直接方法,但它的缺点是需要另一次往返来查询 BigQuery 服务,这需要几秒钟的时间。这是一个 0“字节计费”查询(仅使用表元数据计算完整表),但当作业“知道”它已将多少行写入输出时,它似乎是多余的。

是否有一种直接且“正确”的方法可以从作业对象获取此计数,而无需往返 BQ 服务?也许是我错过/误解了一个字段,或者是作业对象中返回此值的函数?

最佳答案

任何作业都有目标表 - 即使您没有显式设置它 - 结果仍然保存在所谓的匿名表中,您可以依次查询该表以获取输出行数。因此,下面简单的额外查询将起作用(注意 - 名称仅作为示例)

SELECT COUNT(1) 
FROM `yourProject._0511743a77ca76c1b55482d7cb1f8e91ac5c7b36.anon17286defe54b5c07ba6810a71abfdba6388ac4e0`   

要使用的实际目标表 - 可以从 configuration.query.destinationTable 检索工作性质

关于google-bigquery - 如何使用 node.js 客户端库计算已完成的 BigQuery 作业的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45230434/

相关文章:

acl - Bigquery - 只写授权

nested - 大查询将重复字段中的结构更新为 null

google-bigquery - 如何在大查询查询中使用标签来跟踪成本?

sql - BigQuery SQL 同一列多个表达式

python - enable-app-engine-project 有点乱

unique - bigquery - 仅过滤掉唯一结果

google-bigquery - 如何从 BigQuery API 获取列名?

google-bigquery - 通过 Apache Beam 写入动态 BigQuery 表

javascript - Google BigQuery Node 库 : how to stream data in batches?

google-bigquery - 如何更改 BigQuery 中的项目