java—获取作业创建的bigquery临时表的最佳方法,以更快地读取大数据

2j4z5cfb  于 2021-06-26  发布在  Java
关注(0)|答案(0)|浏览(191)

我正在尝试使用bigquery的java客户机库对bigquery中的表执行查询。我创建了一个作业,然后使用job.getqueryresults().iterateall()方法获得作业的结果。
这种方法是可行的,但对于像600k这样的大数据,需要大约80-120秒的时间。我看到bigquery以4-4.5万个批次获取数据,每个批次大约需要5-7秒。
我想更快地得到结果,我在互联网上发现,如果我们能从作业中获得bigquery创建的临时表,并从该表中读取avro格式或其他格式的数据,if将非常快,但在bigquery api(使用版本:1.124.7)中,我不这么认为。有没有人知道如何在java中做到这一点,或者在有大量记录的情况下如何更快地获取数据。感谢您的帮助。
读取表的代码(需要20秒)

Table table = bigQueryHelper.getBigQueryClient().getTable(TableId.of("project","dataset","table"));
    String format = "CSV";
    String gcsUrl = "gs://name/test.csv";
    Job job = table.extract(format, gcsUrl);
    // Wait for the job to complete
    try {
      Job completedJob = job.waitFor(RetryOption.initialRetryDelay(Duration.ofSeconds(1)),
              RetryOption.totalTimeout(Duration.ofMinutes(3)));
      if (completedJob != null && completedJob.getStatus().getError() == null) {
        log.info("job done");
        // Job completed successfully
      } else {
        log.info("job has error");
        // Handle error case
      }
    } catch (InterruptedException e) {
      // Handle interrupted wait
    }

使用查询读取相同表的代码(需要90秒)

Job job = bigQueryHelper.getBigQueryClient().getJob(JobId.of(jobId));
      for (FieldValueList row : job.getQueryResults().iterateAll()) {
        System.out.println(row);
}

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题