Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以根据窗口元素的时间戳动态生成BigQuery表名?_Java_Google Bigquery_Google Cloud Dataflow - Fatal编程技术网

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

Java 是否可以根据窗口元素的时间戳动态生成BigQuery表名?,java,google-bigquery,google-cloud-dataflow,Java,Google Bigquery,Google Cloud Dataflow,例如,如果我有一个Dataflow streaming作业,它有5分钟的窗口,可以从PubSub读取数据,我知道如果我给一个元素分配一个过去两天的时间戳,就会有一个包含该元素的窗口,如果我使用BigQueryIO.java中描述的将每日表输出到BigQuery的示例,作业将使用实际日期在BigQuery表中写入过去两天的元素 我想用窗口元素的时间戳而不是当前窗口的时间将过去的元素写入BigQuery表,是否可能 现在我遵循DataflowJavaSDK/sdk/src/main/java/com

例如,如果我有一个Dataflow streaming作业,它有5分钟的窗口,可以从PubSub读取数据,我知道如果我给一个元素分配一个过去两天的时间戳,就会有一个包含该元素的窗口,如果我使用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;
               }
             }));
PCollection quotes=。。。
quotes.apply(Window.info(CalendarWindows.days(1)))
.apply(BigQueryIO.Write
.命名(“写”)
.withSchema(schema)
.to(新的SerializableFunction(){
公共字符串应用(BoundedWindow){
String dayString=DateTimeFormat.forPattern(“yyyy\u MM\u dd”).parseDateTime(
((DaysWindow)窗口);
返回“我的项目:output.output\u table\uuuu”+dayString;
}
}));

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

TL;DR代码应该已经执行了您想要的操作;如果不是,请发布更多详细信息

详细解释: 数据流处理的关键创新之一是事件时间处理。这意味着数据流中的数据处理几乎与处理发生的时间完全解耦——重要的是正在处理的事件发生的时间。这是使完全相同的代码能够在批处理或流式数据源上运行的关键要素(例如,使用处理历史单击日志的相同代码处理实时用户单击事件)。它还支持灵活处理延迟到达的数据

请参阅“事件时间与处理时间”一节,了解数据流处理模型这方面的描述(整篇文章非常值得一读)。有关更详细的说明,请参阅。在和的官方文档中也以更面向用户的方式描述了这一点

因此,不存在“当前窗口”,因为管道可能同时处理在不同时间发生并属于不同窗口的许多不同事件。事实上,正如VLDB论文所指出的,数据流管道执行的一个重要部分是“按窗口分组元素”


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

上述代码不再适用于我。谷歌文档中有一个例子,DaysWindow被IntervalWindow取代,IntervalWindow为我工作:

 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;
       }
     }));
PCollection quotes=。。。
quotes.apply(Window.into(CalendarWindows.days(1)))
.apply(BigQueryIO.Write
.命名(“写”)
.withSchema(schema)
.to(新的SerializableFunction(){
公共字符串应用(BoundedWindow){
//下面的强制转换是安全的,因为CalendarWindows.days(1)生成间隔窗口。
String dayString=DateTimeFormat.forPattern(“yyyy\u MM\u dd”)
.withZone(DateTimeZone.UTC)
.print(((IntervalWindow)窗口).start());
返回“我的项目:output.output\u table\uuuu”+dayString;
}
}));

向我们展示一些代码,因为不清楚您在问什么。奔腾10-我已经用我现在使用的代码更新了问题。