由于查询的方式和业务需求的不同,会产生不同的输出模式,在这里主要是有三种输出模式:
A)Append mode(default):仅仅从上次触发计算到当前新增的行会被输出到sink。仅仅支持行数据插入结果表后不进行更改的query操作。因此,这种方式能保证每行数据仅仅输出一次。例如,带有Select,where,map,flatmap,filter,join等的query操作支持append模式。
B)Complete mode:每次trigger都会将整个结果表输出到sink。这个是针对聚合操作的。
C) Updata mode:仅仅是自上次trigger之后结果表有变更的行会输出到sink。在以后的版本中会有更详细的信息。
1. 查询和输出模式对应关系
不同类型的Streaming query支持不同的输出模式。
Query Type | 支持的输出模式 | 注释 | |
带聚合的查询 | Aggregation on event-time with watermark | Append, Update, Complete | Append mode和Update mode采用watermark来drop掉历史的聚合状态。Complete mode不会删除历史聚合状态。 |
Other aggregations | Complete , Update | 由于没有定义watermark,旧的聚合状态不会drop。Append mode不支持是因为聚合操作是违反该模式的含义的。 | |
mapGroupsWithState | Update |
| |
flatMapGroupsWithState | Append | Append | flatMapGroupsWithState之后运行Aggregations |
Update | Update | flatMapGroupsWithState之后不允许Aggregations | |
Join | Append | 带有join操作的至今不支持update和complete模式。 | |
Other queries | Append, Update | Complete mode不支持这种模式的原因是在结果表保留所有的非聚合的数据是不合适的。 |
2. 输出模式和sink
Sink | Outputmode | Options | 容错 | 注释 |
FileSink | Append | path:输出路径,必须指定 | Yes, 仅一次处理 | 支持写入分区表。按照时间分区或许比较好使。 |
Kafkasink | Append,Update,complete | 会有专题 | YES。最少一次处理语义。 | 会有专题 |
ForeachSink | Append,Update,Complete | None | 依赖于具体的ForeachWriter的实现 | 下面会有例子 |
ConsoleSink | Append,Complete,Update | NumRows:每个trigger显示的行数。Truncate:假如太长是否删除,默认是true | No |
|
MemorySink | Append,Complete | None | No.但是在Completemode 重新query就会导致重新创建整张表 | 后续sql使用的表名就是queryName |