繁体   English   中英

是否可以根据窗口元素的时间戳动态生成BigQuery表名?

[英]Is it possible to dynamically generate BigQuery table names based on the timestamps of the elements of a window?

例如,如果我有一个从PubSub读取的5分钟窗口的数据流流媒体作业,我理解如果我将一个超过两天的时间戳分配给一个元素,那么将有一个带有该元素的窗口,如果我使用的示例是将每日表输出到BigQueryIO.java中描述的BigQuery,该作业将使用实际日期在BigQuery表中写入过去两天的元素。

我想将过去的元素写入BigQuery表,并使用窗口元素的时间戳而不是当前窗口的时间,是否可能?

现在我按照DataflowJavaSDK / sdk / src / main / java / com / google / cloud / dataflow / sdk / io / BigQueryIO.java中描述的示例:

    PCollection<TableRow> quotes = ...
    quotes.apply(Window.<TableRow>info(CalendarWindows.days(1)))
       .apply(BigQueryIO.Write
         .named("Write")
         .withSchema(schema)
         .to(new SerializableFunction<BoundedWindow, String>() {
               public String apply(BoundedWindow window) {
                 String dayString = DateTimeFormat.forPattern("yyyy_MM_dd").parseDateTime(
                   ((DaysWindow) window).getStartDate());
                 return "my-project:output.output_table_" + dayString;
               }
             }));

如果我理解正确,您希望确保根据元素(引号)的固有时间戳创建BigQuery表,而不是管道运行时的挂钟时间。

TL; DR代码应该已经做你想要的了 ; 如果不是,请发布更多详情。

更长的解释:Dataflow处理的关键创新之一是事件时间处理 这意味着Dataflow中的数据处理几乎完全与处理发生时分离 - 重要的是处理事件发生的时间。 这是在批处理或流数据源上运行完全相同的代码的关键要素(例如,使用处理历史点击日志的相同代码处理实时用户点击事件)。 它还可以灵活处理迟到的数据。

请参阅批处理世界 ,“事件时间与处理时间”部分,以了解Dataflow处理模型的这一方面(整篇文章非常值得一读)。 有关更深入的说明,请参阅VLDB文件 窗口触发器的官方文档中,这也以面向用户的方式进行了描述。

因此, 不存在诸如“当前窗口”之类的东西,因为管道可以同时处理在不同时间发生并且属于不同窗口的许多不同事件。 事实上,正如VLDB文件指出的那样,Dataflow管道执行的一个重要部分是“按窗口分组元素”。

在您展示的管道中,我们将使用记录上提供的时间戳将要写入BigQuery的记录分组到窗口中,并将每个窗口写入其自己的表,如有必要,为新遇到的窗口创建表。 如果后期数据到达窗口(请参阅关于窗口的文档和触发器以讨论后期数据),我们将附加到已有的表中。

上面提到的代码对我不起作用了。 Google文档中有一个更新的示例 ,但DaysWindowIntervalWindow取代,后者对我有用

 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;
       }
     }));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM