Google BigQuery Java Client listTables返回numBytes为null问题咨询
问题根因
这是BigQuery API的固有设计,不是你的代码实现错误:
- BigQuery的
listTables(对应你代码中调用的dataset.list())接口为了优化批量查询性能,返回的Table对象是精简视图,默认不会填充numBytes、numRows、schema这类计算成本较高的元数据字段,因此直接读取会返回null。 - 单独调用
getTable接口时会请求全量表元数据,所以可以拿到正确的存储量、行数等数值。
解决方案
如果需要批量获取所有表的存储大小,有两种可行方案:
- 对列表返回的每个Table对象调用
reload()方法拉取完整元数据,修改后的代码示例如下:
Page<Dataset> datasetPage = getAllDatasets("projectId"); if(datasetPage!=null) { for (Dataset dataset : datasetPage.iterateAll()) { for(Table table : dataset.list().iterateAll()) { // 主动拉取全量表元数据 Table fullTable = table.reload(); System.out.println(fullTable.getNumBytes()); } } }
注意:该方案会对每个表发起一次单独的API请求,表数量较多时可能触发API配额限制,建议搭配限流逻辑使用。
- 直接查询BigQuery内置元数据表批量获取存储信息,性能更高且不会触发高频API调用,查询SQL示例如下:
-- 方式1:查询__TABLES__系统表 SELECT table_id, row_count AS numRows, size_bytes AS numBytes FROM `你的项目ID.你的数据集ID.__TABLES__` -- 方式2:查询标准INFORMATION_SCHEMA SELECT table_name, row_count, total_bytes FROM `你的项目ID.你的数据集ID.INFORMATION_SCHEMA.TABLES`
内容的提问来源于stack exchange,提问作者Sachin Janani
相关产品推荐
相关产品推荐

