BigQuery - 如何使用java API迭代结果

时间:2017-02-07 20:56:05

标签: java google-bigquery

我正在尝试下载90k行的查询结果(此数量表示Web UI和生成的对象)但我在迭代器中获得了超过130k项,如下所示:

QueryRequest queryRequest = QueryRequest
                                        .newBuilder("......")
                                        .setUseLegacySql(true)
                                        .build();
QueryResponse response = bigquery.query(queryRequest);
QueryResult result = response.getResult();
Integer c = 0;

while(result != null){
          Iterator<List<FieldValue>> iter = result.iterateAll();
          while(iter.hasNext()){
              iter.next();
              c++;
            }    
          result = result.getNextPage();
}

在阅读结束时大约是130K,但reuslt.getTotalRows()包含90K。

你对我做的不正确有什么想法吗?

1 个答案:

答案 0 :(得分:2)

JavaDoc开始,Page.iterateAll()返回所有页面的结果。

您将获得所有结果(从第一页开始),然后前进到下一页,您将再次获得所有结果(减去第一页)。将页面大小设置为较小的数字实际上会增加您获得的结果。

您的代码应如下所示:

QueryRequest queryRequest = QueryRequest
                                    .newBuilder("......")
                                    .setUseLegacySql(true)
                                    .build();
QueryResponse response = bigquery.query(queryRequest);
QueryResult result = response.getResult();
Integer c = 0;

Iterator<List<FieldValue>> iter = result.iterateAll();
while(iter.hasNext()){
    iter.next();
    c++;
}