首页 > 解决方案 > 使用标准 sql 时无法在 Bigquery 的单个表中写入多个分区

问题描述

我正在从多个表中读取数据并创建 7 天的分区,尝试将数据写入相应的日期分区以调整特定日期的更改。

我正在使用该WRITE.TRUNCATE方法来避免重复。但是,在写入表时,我只获取最后一天分区的数据,并且没有填充所有其他分区。旧作业在 Legacy SQL 中运行并且运行良好,但是我正在尝试迁移到标准 SQL,并且从那时起这个问题一直存在。附上以下代码:

for (int i = 1; i <= PARTITION_CREATE_DAYS; ++i) {
      LocalDate partDate = params.referenceDate.minusDays(PARTITION_CREATE_DAYS - i);

      String query = String.format(sql, partDate.toString(), params.referenceDate.toString(),params.TableA, params.TableB, params.TableC, params.TableD);
      jobs.add(createJob(params, bq, query, partDate));

    }

    boolean allSucceeded = waitForJobs(jobs.listIterator());

    if (allSucceeded) System.out.println("Job finished successfully!");
    else System.exit(1);
  }

private static Job createJob(Params params, BigQuery bq, String query, LocalDate partDate) {
    String partition = "$" + partDate.format(BQ_PARTITION_FORMAT);
    TableId tableId = TableId.of(params.outProj, params.outDataset, params.outTable + partition);


    Job job = bq.create(JobInfo.of(QueryJobConfiguration.newBuilder(query)
        .setDestinationTable(tableId)
        //.setAllowLargeResults(true)
        .setUseLegacySql(false)
        .setUseQueryCache(true)
        .setPriority(QueryJobConfiguration.Priority.values()[params.priority == 'i' ? 0 : 1])
        .setWriteDisposition(JobInfo.WriteDisposition.WRITE_TRUNCATE)
        .build()));
    System.out.println("Submitted BQ job " + job.getJobId().getJob() + " for partition " + partition);

    return job;
  }

}

PARTITION_CREATE_DAYS = 8

referenceDate = current date

标签: javagoogle-bigquerybigquery-standard-sql

解决方案


推荐阅读