我的数据流通常是无序的。我将数据集定义为:
DataStream<ApplicationMetric> metrics = env
.addSource(new FlinkKinesisConsumer<>("applicationMetric", new SimpleStringSchema(), consumerConfig))
.map(mapper)
.assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor<>(Time.seconds(30)));
并将其打印为:
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();
那么,如果我尝试在带有时间窗口(翻滚等)的 SQL 查询中使用它,它会如何工作,是否受到尊重?我认为我对这些概念的理解可能从根本上是错误的。但我假设迟到的事件将被删除,我可以使用我的行时间作为滚动窗口属性?
最佳答案
您可以控制how late events are treated在数据流 API 中。默认情况下,所有晚于 30 秒的事件都会被删除到代码中。这 30 秒会增加端到端延迟,因此输出会被阻止,直到 Flink 看到 30 秒的数据并尊重所有延迟事件。您还可以将延迟事件存储在单独的输出或重新触发计算中。
不幸的是,Table API/SQL 不支持此配置。迟到的事件总是会被丢弃,但这似乎足以满足您的用例。
关于java - 在 Flink SQL Windows 中使用带有延迟的事件时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60218235/