获取 BigQuery 表中的行数(流式缓冲区)

Posted

技术标签:

【中文标题】获取 BigQuery 表中的行数(流式缓冲区)【英文标题】:Get number of rows in a BigQuery table (streaming buffer) 【发布时间】:2019-02-10 19:56:24 【问题描述】:

我正在通过 Streaming 进行插入。在 UI 中,我可以看到以下行数:

有没有办法通过 API 获得?我现在做的时候:

from google.cloud import bigquery
client = bigquery.Client()
dataset = client.dataset("bqtesting")
table = client.get_table(dataset.table('table_streaming'))
table.num_rows
0

显然 0 不是我想要得到的数字。从 API 文档中可以看出:

numRows unsigned long [Output-only] 此表中数据的行数,不包括流缓冲区中的任何数据。

那么,我的问题是:我们如何获得表中的确切行数?目前我正在做:

count=[item[0] for item in client.query('SELECT COUNT(*) FROM `bqtesting.table_streaming`').result()][0]    

但这需要大约 5 秒才能获得计数(我需要非常频繁地执行此查询以查看是否所有流式插入都已“完成”)。

【问题讨论】:

行计数元数据更新需要一些时间(根据我的经验最多 30 分钟) 【参考方案1】:

select count(1)select count(*) 等有 0 个已扫描和计费字节(您可以在运行后或试运行后在作业元数据中看到这一点),因此您应该能够随心所欲地运行它们 如果我正确阅读了文档,则不能保证其中的数字会为您提供缓冲区中尚未刷新到大查询存储的行

您也可以使用此处提到的 API https://cloud.google.com/bigquery/streaming-data-into-bigquery#dataavailability,即从 tables.get 结果中检查 streamingBuffer.oldestEntryTime 字段

【讨论】:

【参考方案2】:

您可以使用__TABLES__ 元数据表来获取您想要的信息。查询__TABLES__ 不会产生任何费用。

您需要的查询是:

SELECT table_id, row_count, size_bytes
FROM `your-project-name.bqtesting.__TABLES__`
WHERE STARTS_WITH(table_id, "table_streaming")
ORDER BY table_id DESC

【讨论】:

这不适用于流媒体,因为它全为零。

以上是关于获取 BigQuery 表中的行数(流式缓冲区)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 BigQuery Streaming 获取插入的行数

插入大查询表的行数少于预期

如何限制 BigQuery 获取的行数?

如何限制BigQuery获取的行数?

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

迭代存储过程 BigQuery 中的行