前言
在FlinkSQL创建表后,将动态表转换为数据流的时候,我们可以选择两种方式:toAppendStream
和toRetractStream
。
官网对此也有解释,编者在此给你找出来了:Flink官网动态表(表转流)说明部分,此处应有掌声。
表转流的几种多态函数
此处我们以toAppendStream
为例:
源码接口代码
<T> DataStream<T> toAppendStream(Table table, TypeInformation<T> typeInfo);
<T> DataStream<Tuple2<Boolean, T>> toRetractStream(Table table, Class<T> clazz);
可以看出:一种是以参数类型(表转换后的数据流的类型
),另外一种就是将参数类型的结果封装到pojo中进行设置。
实例代码
TypeInformation
DataStream<Tuple2<Boolean, Tuple2<Integer, Integer>>> joinStream = bsTableEnv.toRetractStream(queryTable, Types.TUPLE(Types.INT, Types.INT));
DataStream<Tuple2<Boolean, Tuple2<Integer, Integer>>> joinStream = bsTableEnv.toRetractStream(queryTable, TypeInformation.of(new TypeHint<Tuple2<Integer, Integer>>(){}));
### Class
DataStream<CustomerStatusLog> result = tableEnvironment.toAppendStream(queryTable, Pojo.class);
表转流概述
流经动态表的数据,往往要经过flinksql的处理,此处便需要连续查询处理,下图显示了流,动态表和连续查询之间的关系:
- 流将转换为动态表。
- 在动态表上进行连续查询,生成新的动态表。
- 生成的动态表将转换回流。(
toAppendStream
和toRetractStream
)
注意:动态表首先是一个逻辑概念。在查询执行期间不一定(完全)实现动态表
。
Append-only stream
附加流:仅进行INSERT
操作修改动态表的情况,将此种动态表转换为DataStream。
Retract stream
撤回流:撤消流是具有两种消息类型的流,即添加消息(add messages)和撤消消息(retract messages)。即添加
和删除
操作,并据此将动态表转换为撤消流,以用于更新(上一个)行和用于更新(新)行的附加消息。
小结
如果不需要更新和删除用可以用toAppendStream
,如果需要则得用toRetractStream
。
除此两种转换方式外,官网还有种Upsert stream(不支持动态表转换数据流),故不赘言:
Please note that only append and retract streams are supported when converting a dynamic table into a DataStream
.
请注意,将动态表转换为DataStream时仅支持only append和retract streams。
2021.2.22补充:
动态匹配表转流数据结果
动态表转流,我们看到输出结果的时候往往要指定输出的数据流的结果类型:无论是Tuple2,还是class。那么如果说我们需要动态匹配结果输出
,那怎么办呢?
我的回答是才采用Row类型数据,源自jar包: org.apache.flink.types.Row
。
DataStream<Row> result = tableEnvironment.toAppendStream(queryTable, Row.class);
import org.apache.flink.types.Row; 使用场景为:flink使用kafka数据源建立FlinkSQL表转数据流,不需要关心执行完FlinkSQL后新的生成的动态表的数据类型。