Flink动态表和时态表总结

动态表

动态表 是 Flink 的支持流数据的 Table API 和 SQL 的核心概念。与表示批处理数据的静态表不同,动态表是随时间变化的。可以像查询静态批处理表一样查询它们。查询动态表将生成一个 连续查询 。一个连续查询永远不会终止,结果会生成一个动态表。查询不断更新其(动态)结果表,以反映其(动态)输入表上的更改。本质上,动态表上的连续查询非常类似于定义物化视图的查询

  • 注意事项
  1. 动态表首先是一个逻辑概念。在查询执行期间不一定(完全)物化动态表
  2. 在流上定义的表在内部没有物化
连续查询

一个不会停止的查询,其结果生成一个动态表。查询不断更新结果表,以反映其(动态)输入的数据在表上的更改。本质上,动态表上的连续查询非常类似于定义物化视图的查询。

  • 动态表和连续查询的关系。
    在这里插入图片描述
  • 连续查询的分类
  1. 更新查询: 查询更新先前输出的结果,即定义结果表的 changelog 流包含 INSERT 和 UPDATE 操作
  2. 追加查询: 查询只附加到结果表,即结果表的 changelog 流只包含 INSERT 操作
  • 更新查询
    连续查询的任务通常要运行数月的时间,要处理的数据量通常会非常大,如果必须要更新先前的结果的查询,则需要维护的状态会非常大。很可能会导致任务崩溃,所以更新查询要慎用。
  • 追加查询
    即不需要更新先前查询结果的查询。例如使用窗口统计每小时的用户点击量这样的查询操作。这种查询不需要维护先前查询结果的状态
查询限制

由于有些连续查询要维护的状态时间长,如果不加以控制,很可能会导致因状态过大而导致任务崩溃,为了防止这种情况发生,可能设置状态的清理时间来定时清理过期的状态。通过TableConfig 进行指定。

// 从TableEnvironment获取查询配置
TableConfig tConfig = tableEnv.getConfig();
// 设置查询参数
tConfig.setIdleStateRetentionTime(Time.hours(12), Time.hours(24));

第一个参数(Time.hours(12))表示最小空闲状态保持时间,即状态需要保留的最小时间。
第二个参数(Time.hours(24))表示最大空闲状态保持时间,即状态保留的最大时间。

流是如何转化为动态表的

看一下StreamTableEnvironment的fromDataStream()方法是如何转化成Table的。

@Override
	public <T> Table fromDataStream(DataStream<T> dataStream) {
   
		JavaDataStreamQueryOperation<T> queryOperation = asQueryOperation(
			dataStream,
			Optional.empty());

		return createTable(queryOperation);
	}

首先将dataStream转换成JavaDataStreamQueryOperation。JavaDataStreamQueryOperation实现自QueryOperation。QueryOperation是面向用户的Table Api操作的基类。重点看一下asQueryOperation方法。

private <T> JavaDataStreamQueryOperation<T> asQueryOperation(
			DataStream<T> dataStream,
			Optional<List<Expression>> fields) {
   
		TypeInfo
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值