动态表
-
动态表是Flink对流数据的Table API 和 SQL支持的核心概念.
-
与表示批处理数据的静态表不同,动态表是随时间变化的.
-
持续查询
- 动态表可以像静态的批处理表一样进行查询,查询一个动态表会产生持续查询(Continuous Query)
- 连续查询永远不会停止,并会生成另一个动态表
- 查询会不断更新其动态结果表,以反映其动态输入表上的更改
动态表和持续查询
- 流式表查询的处理过程:
- 流被转换为动态表
- 对动态表计算连续查询,生成新的动态表
- 生成的动态表被转换回流
将流转换成动态表
-
为了处理带有关系查询的流,必须先将其转换为表
-
从概念上将,流的每个数据操作,都被解释为对结果表的查询(Insert)修改操作
持续查询
- 持续查询会在动态表上做计算处理,并作为结果生成新的动态表
时间特性
- 基于时间的操作(比如Table API和 SQL中窗口操作),需要定义相关的时间语义和时间数据来源的信息
- Table 可以提供一个逻辑上的时间字段,用于在表处理程序中,指示时间和访问相应的时间戳
- 时间属性,可以是每个表schema的一部分。一旦定义了时间属性,它就可以做为一个字段引用,并且可以在基于时间的操作中使用
- 时间属性的行为类似于常规时间戳,可以访问,并且进行计算。
定义处理时间
-
处理时间语义如下,允许表处理程序根据机器的本地时间生成结果。它是时间的最简单的概念。它既不需要提取时间戳,也不需要生成watermark
-
由DataStream转换成表时指定
- 在定义Schema期间。可以使用.proctime,指定字段名定义处理时间字段。
- 这个proctime属性只能通过附加逻辑字段,来扩展物理schema。因此,在schema定义的末尾定义它。
Table tempTable = tableEnv.fromDataStream(dataStream,"id, temp, timestamp, pt.proctime");
-
定义处理时间(Processing Time)
.withSchema(new Schema() .field("id",DataTypes.STRING()) .field("timestamp",DataTypes.BIGINT()) .field("temp",DataTypes.DOUBLE()