2017-02-07 9 views
2

90k行のクエリ結果をダウンロードしようとしていますが(この量はWeb UIとその結果のオブジェクトを示しています)、イテレータでは130kを超えるアイテムが次のように取得されます:BigQuery - Java APIを使用して結果を反復する方法

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が含まれています。

あなたは私が正しく行っていないことについて何か考えていますか?

+0

私はあなたがバグのいくつかの並べ替えを打ったと思います。私は再現することができます。おかしいです。また、 'setPageSize()'パラメータを設定するとさらに悪化します。たとえば、5Kの結果の 'limit'、' setPageSize(1000L) 'を持つクエリを発行し、それが15K回反復したものです。バグは 'getNextPage()'メソッドにあると思います。あなたのコードは、 - > https://github.com/GoogleCloudPlatform/java-docs-samples/blob/master/bigquery/cloud-client/src/main/java/com/example/bigquery/SimpleApp.javaでよく見えます。 。 Googleの担当者が明確にできるかどうか確認するために問題を提起しました - > https://github.com/GoogleCloudPlatform/java-docs-samples/issues/506 –

+0

ありがとう!あなたの問題をgithubに統合しました。私はgoogleの人が従来のsQL標準に切り替えることに気づいた。 –

答えて

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

ちょうどチェックされて、あなたは正しい、大きなクエリの例はあまり明確ではありません。 –

関連する問題