个人博客: http://wuchong.me
2023年02月
2022年01月
Flink SQL 目前还不支持 "processing-time temporal join",即处理时间的时态表关联。这是因为 processing-time temporal join 在语义上要求先处理完 temporal table 的历史数据(bootstrap state),再处理事实表的数据和temporal table的增量数据,目前Flink在底层还不支持如此灵活的调度模型。
不过 Flink SQL 支持 event-time temporal join,要求"FOR SYSTEM AS OF" 的字段是一个 event time attribute。另外 Flink SQL 也支持 lookup join,要求被temporal join 的表是一个支持了 lookup 数据源。
keyBy配不了权重。如果使用 DataStream.partitionCustom 可以自定义将 key 分到哪个 partition,但是 partitionCustom 之后接的 operator 无法使用 keyed state.
window 不输出的还有一个可能是watermark 有问题,即 watermark 一直没有前进。 你可以进 watermark 页面看看 watermark 是否正常。
我觉得这个应该是个 bug,可以在Flink 邮件列表中提问下。
可以不用 TTL 机制,可以通过 ProcessFunction 注册 3天的 Timer 来绕过,Timer 回调时删除对应 key 的状态。
社区同学提醒,一护:这个问题最新版应该已经解了,是因为ttl state的序列化器在duplicate的时候少传了一个参数
issue 链接:https://issues.apache.org/jira/browse/FLINK-10567
1.6.3 版本已经修复了这个问题。
CsvTableSink 用在无限流的场景下的话,不会马上写出去,会 buffer 起来,在结束的时候会 flush 出去。所以一般常用在测试场景。在真实线上的话,建议用 StreamingFileSink 或者 RollingFileSink。
使用的时候: res.toAppendStream[Row].addSink(new StreamingFileSink(...))
你的 rowtime 定义的没有问题,window 写法也没问题, alias 也没有问题。
问题出在你在最后的 select 中,用了 over window 语法, 也就是 clicks.sum over w, impressions.sum over w
。over Window 的语法,请参考 https://ci.apache.org/projects/flink/flink-docs-master/dev/table/sql.html 搜索 over window,
如果只是想做 window aggregare, 直接 clicks.sum, impressions.sum
即可。
据我所知,Flink SQL目前 没有能直接将 bigint 转成 timestamp 的内置函数, 需要自己实现 UDF 。
Flink 社区的开发者基本上清一色的都是用的 IntelliJ IDEA , eclipse 没有 IDEA 好用,而且它的 scala 插件有些问题。
join 之后 watermark(和 rowtime) 都会丢失,后面就无法再接 window aggregate了。
你可以尝试使用 window-join, https://ci.apache.org/projects/flink/flink-docs-master/dev/table/sql.html#joins 搜索Time-windowed Join
-------------------------
-------------------------
-------------------------
-------------------------
-------------------------