Java 在Flink SQL窗口中使用具有延迟的事件时间

Java 在Flink SQL窗口中使用具有延迟的事件时间,java,sql,apache-flink,Java,Sql,Apache Flink,我有一个数据流,通常是无序的。我将数据集定义为: DataStream<ApplicationMetric> metrics = env .addSource(new FlinkKinesisConsumer<>("applicationMetric", new SimpleStringSchema(), consumerConfig)) .map(mapper) .assignTimestampsAndWatermarks(new BoundedOutOfO

我有一个数据流,通常是无序的。我将数据集定义为:

DataStream<ApplicationMetric> metrics = env
  .addSource(new FlinkKinesisConsumer<>("applicationMetric", new SimpleStringSchema(), consumerConfig))
  .map(mapper)
  .assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor<>(Time.seconds(30)));  
那么,如果我尝试在带有时间窗口(翻滚等)的SQL查询中使用它,该如何工作呢?我想我可能在概念上根本错了。但我假设延迟事件将被删除,并且我可以使用我的行时间作为滚动窗口属性?

您可以在Datastream API中进行控制。默认情况下,30秒之后的所有事件都会在代码中删除。这30秒会增加您的端到端延迟,因此输出会被延迟,直到Flink看到30秒的数据并尊重所有延迟事件。您还可以将延迟事件存储在单独的输出或重新触发计算中

不幸的是,表API/SQL上不支持此配置。延迟事件总是会被删除,但这对于您的用例来说似乎已经足够了

Table table = bsTableEnv.fromDataStream(dataset, "createdAt, name, duration, rowtime.rowtime");
Table t1 = bsTableEnv.sqlQuery("SELECT CAST((createdAt/1000) as TIMESTAMP) as ts, rowtime, name, duration " + table);
bsTableEnv.toAppendStream(t1, Row.class).print();