按照官方教程从Google BigQuery中获取数据时遇到了一个问题。当数据量只有2~3w的时候获取的数据量是正常的,但是当数据量足够多的时候,获取到的数据量往往比实际数据量多,当然,其中的数据是有重复的。
这个Google官方的迭代数据的代码
QueryResult result = response.getResult();
// Print all pages of the results.
while (result != null) {
for (List<FieldValue> row : result.iterateAll()) {
List titles = row.get(0).getRepeatedValue();
System.out.println("titles:");
for (FieldValue titleValue : titles) {
List titleRecord = titleValue.getRecordValue();
String title = titleRecord.get(0).getStringValue();
long uniqueWords = titleRecord.get(1).getLongValue();
System.out.printf("%s: %dn", title, uniqueWords);
}
long uniqueWords = row.get(1).getLongValue();
System.out.printf("total unique words: %dn", uniqueWords);
}
result = result.getNextPage();
}
在这段代码中,result.iterateAll()是迭代全部的记录,迭代一遍后,result.getNextPage()不为空,下个循环得到的依然是全部的记录,直到最后一页。所以当数据量小的时候,小到小于分页大小的时候获得是数据量是正常的,但是当数据量超过分页大小时,数据就会重复了,正确的迭代姿势应该是这样的
List fields=result.getSchema().getFields();
// Print all pages of the results.
Iterator it = result.iterateAll().iterator();
while (it.hasNext()) {
List values= it.next();
Document document=new Document();
for (int i=0;i<values.size();i++) { if("created_at".equals(fields.get(i).getName())){ document.put(fields.get(i).getName(),new Date(values.get(i).getTimestampValue()/1000)); }else document.put(fields.get(i).getName(),values.get(i).getValue()); } if(!"null".equals(document.get("_id"))) { documents.add(document); count++; } if(count==BATCH_SIZE){ if(documents.size()>0) {
insertData(documents);
}
documents.clear();
count = 0;
}
}
ps:这段代码包含了我项目的逻辑,方法是这样的。
Comments | 2 条评论
Pdfstar
该评论为私密评论
jinyang
该评论为私密评论