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
当我尝试使用 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