在不同的文件上写明智的结果

时间:2016-01-25 04:34:52

标签: google-cloud-dataflow

是否可以在不同的文件上编写窗口结果。意思是,我需要将时间附加到文件前缀或创建时间目录,以便我可以访问特定的窗口结果而无需额外的过滤器。 (就像apache-spark

1 个答案:

答案 0 :(得分:2)

答案取决于您是在批处理还是流式处理模式下使用窗口。

在流媒体模式下,Cloud Dataflow Service不支持写入文件at this time。在这种情况下,您需要使用BigQuery接收器,我们支持每窗口分片。

代码示例(有关详细信息,请参阅Javadoc):

PCollection<TableRow> quotes = ...;
quotes.apply(Window.<TableRow>into(CalendarWindows.days(1)))
  .apply(BigQueryIO.Write
     .named("Write")
     .withSchema(schema)
     .to(new SerializableFunction<BoundedWindow, String>() {
       public String apply(BoundedWindow window) {
         // The cast below is safe because CalendarWindows.days(1) produces IntervalWindows.
         String dayString = DateTimeFormat.forPattern("yyyy_MM_dd")
              .withZone(DateTimeZone.UTC)
              .print(((IntervalWindow) window).start());
         return "my-project:output.output_table_" + dayString;
       }
     }));

在批处理模式下,TextIO.Write没有为此目的准备好的方便方法,但您可以自己实现类似的东西而不会有太多麻烦。例如,实现此目的的方法是通过Partition转换,其输出通过管道传输到单独的TextIO.Write接收器。