我想获取使用以下方式运行的作业的行数:
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/