简体   繁体   English

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

[英]BigQuery - How to iterate over results using java API

I am trying to download a query result of 90k rows (this amount states the web UI and the resulting object) but I obtain more than 130k items in the iterator as follows:我正在尝试下载 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();
}

At the end of the reading is about 130K but reuslt.getTotalRows() contains 90K.读数结束时约为 130K,但reuslt.getTotalRows()包含 90K。

Do you have any idea on what I'am doing not correctly?你知道我做错了什么吗?

From JavaDoc , Page.iterateAll() returns results from all pages.JavaDoc , Page.iterateAll() 返回所有页面的结果。

You get all results (from the first page), then advance to the next page, where you get all results again (minus the first page).您获得所有结果(从第一页),然后前进到下一页,在那里您再次获得所有结果(减去第一页)。 Setting the page size to a smaller number actually increases the results you get.将页面大小设置为较小的数字实际上会增加您获得的结果。

Your code should look like this:您的代码应如下所示:

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++;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM