2017-02-07 3 views
2

90k 행의 쿼리 결과 (이 양은 웹 UI와 결과 객체를 나타냄)를 다운로드하려고하는데 다음과 같이 반복기에서 130,000 개가 넘는 항목을 가져옵니다.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

그냥 확인 했으므로 큰 쿼리 예제는 분명하지 않습니다. –

관련 문제