Google Bigquery java 客户端 listTables return numBytes 和 numRows 为空

Google Bigquery java client listTables return numBytes and numRows as null

当我尝试使用 BigQuery java 客户端的 listTables API 查找所有表的大小时,它 returns 为空。但是如果我单独使用 getTable,我会得到正确的数据。这是一个已知问题,还是我做错了什么。以下是 returns numBytes 的空值的代码:

Page<Dataset> datasetPage = getAllDatasets("projectId");
        if(datasetPage!=null) {
            for (Dataset dataset : datasetPage.iterateAll()) {
                for(Table table : dataset.list().iterateAll()) {
                    System.out.println(table.getNumBytes());  // Returns Null. **
                }
            }
        }

在此 Public 问题跟踪器 thread 中,已经讨论了使用 listTables 获取 numBytes 和 numRows 的 null 值是预期的行为。 BigQuery API 认为检索 numBytes 和 numRows 是一项昂贵的操作,因此 returns null。所以,listTables只有returns部分信息了table.

作为解决方法,使用 getTable() 在循环中单独检索 table 的信息。我测试了下面的代码片段,并且能够获得所有 table 的 table 大小(以字节为单位)。

public static void getAllTableSize(String projectId) {
    try {
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
      Page<Dataset> datasetPage = bigquery.listDatasets(projectId);
        if(datasetPage!=null) {
            for (Dataset datasetTemp : datasetPage.iterateAll()) {
                for(Table table : datasetTemp.list().iterateAll()) {
                    Table tableTemp = bigquery.getTable(table.getTableId());
                    String tableName = tableTemp.getTableId().getTable();
                    Long tableSize = tableTemp.getNumBytes();
                    System.out.println("Table Name: " + tableName + "  " + "Table Size: " + tableSize);  
                }
            }
        }
    } catch (BigQueryException e) {
        System.out.println("Error occurred: " + e.toString());
      }
    }

回答我自己的问题 listTables api 旨在 return 仅部分信息。这个在代码文档中有提到 https://github.com/googleapis/java-bigquery/blob/dfa15e5ca08a3227f015a389c4c08732178a73e7/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/spi/v2/BigQueryRpc.java#L155