Google BigQuery之获取数据重复问题

2017-11-07 - 5,801 Views - 0 Goods - 2 条评论

按照官方教程从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:这段代码包含了我项目的逻辑,方法是这样的。

转载请注明原文链接:首页 -> 学习记录 -> Google BigQuery之获取数据重复问题

FuZhou . FuJian

"Never start something you're not willing to finish"