Flink Table / SQL API:会话窗口聚合后修改rowtime属性

时间:2018-10-12 17:05:07

标签: scala apache-flink flink-streaming flink-sql

我想使用Session窗口聚合,然后在Tumble中产生的结果之上运行Table API/Flink SQL窗口聚合。

是否可以在第一次rowtime聚合之后修改session属性,使其等于会话中最后观察到的事件的.rowtime

我正在尝试做这样的事情:

table
  .window(Session withGap 2.minutes on 'rowtime as 'w)
  .groupBy('w, 'userId)
  .select(
    'userId,
    ('w.end.cast(Types.LONG) - 'w.start.cast(Types.LONG)) as 'sessionDuration,
    ('w.rowtime - 2.minutes) as 'rowtime
  )
  .window(Tumble over 5.minutes on 'rowtime as 'w)
  .groupBy('w)
  .select(
    'w.start,
    'w.end,
    'sessionDuration.avg as 'avgSession,
    'sessionDuration.count as 'numberOfSession
  )

关键部分是:

('w.rowtime - 2.minutes) as 'rowtime

因此,我想重新分配会话中最新事件的.rowtime记录,而没有会话间隔(在此示例中为2.minutes)。

这在BatchTable中工作正常,但是在StreamTable中不工作:

Exception in thread "main" org.apache.flink.table.api.ValidationException: TumblingGroupWindow('w, 'rowtime, 300000.millis) is invalid: Tumbling window expects a time attribute for grouping in a stream environment.

是的,我知道,感觉就像我不想发明一种时间机器并更改时间顺序。但是实际上有可能以某种方式实现描述的行为吗?

1 个答案:

答案 0 :(得分:0)

否,不幸的是,您不能使用SQL或当前版本(1.6.0)中的Table API来执行此操作。修改时间属性(运行时间或过程时间)后,它立即成为常规的TIMESTAMP属性,并且失去其特殊的时间特性。

对于rowtime属性,原因是我们不能保证时间戳仍然与水印对齐。原则上,我们可以将水印延迟所减去的时间间隔,但这尚不支持。