如何在批量数据流作业中使用基于数据本身的日期写入日期分区的BigQuery表?

时间:2016-09-30 07:52:06

标签: google-bigquery google-cloud-dataflow

我有许多文本文件,其中包含我要从批处理模式下运行的DataflowPipelineRunner导入日期分区的BigQuery表的数据。我不想在运行时插入当天的分区,而是根据每行中提到的日期插入分区。 (不幸的是我无法使用bq命令行工具直接导入文本文件,因为我需要转换一些值。)

我尝试通过从ParDo函数输出时间戳来插入,该时间戳窗口化为天,然后应用该窗口并输出后缀为$的表名和相应的日期。

BigQueryIO.Write.to(new SerializableFunction<BoundedWindow, String>() {
  public String apply(BoundedWindow window) {
    String dayString = DateTimeFormat.forPattern("yyyyMMdd")
                         .withZone(DateTimeZone.forID("Europe/Stockholm"))
                         .print(((IntervalWindow)window).start());
    return dataset  + "$" + dayString;
  }
})
.withSchema(schema.getSchema())
.withCreateDisposition(BigQueryIO.Write.CreateDisposition.CREATE_IF_NEEDED)
.withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_APPEND));

当我尝试运行此功能时,我受到了影响by a Dataflow bug。我也found out那个

  

批处理模式下尚不支持每窗口表。

那么我怎样才能将指定日期作为分区写入日期分区表?

1 个答案:

答案 0 :(得分:1)

如果您需要输出相对较小的固定数量的表,则可以为每个表创建单独的BigQueryIO.Write变换,然后根据日期partition创建数据。如果输出表的数量非常大,那么在批处理Dataflow支持每个窗口表之前,目前还没有一个好的解决方案。