前言

在FlinkSQL创建表后,将动态表转换为数据流的时候,我们可以选择两种方式:toAppendStreamtoRetractStream

官网对此也有解释,编者在此给你找出来了: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的处理,此处便需要连续查询处理,下图显示了流,动态表和连续查询之间的关系:

flinkcep动态规则 flink 动态表_flinksql

  1. 流将转换为动态表。
  2. 在动态表上进行连续查询,生成新的动态表。
  3. 生成的动态表将转换回流。(toAppendStreamtoRetractStream

注意:动态表首先是一个逻辑概念。在查询执行期间不一定(完全)实现动态表

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后新的生成的动态表的数据类型。