1:首先要区分普通表和时态表
1.1:普通表:
可以理解为普通表就是一张随着时间数据在不断变化的表,类似于每个停车场内现存的车辆个数,他的最大特点是数据持续发生变化但是始终保持原有的条数,类似于总量总和,这个数据是不断的发生变化的,一般来讲这张表对应的是外部数据表例如:
假设 LatestRates
是一个物化的最新汇率表 (比如:一张 HBase 表),LatestRates
总是表示 HBase 表 Rates
的最新内容。
我们在 10:15:00
时查询到的内容如下所示:
我们在 11:00:00
时查询到的内容如下所示:
普通表的建表语句也和常用的sql相同
1.2:时态表:
时态表也可以称之为版本表,随着时间的变化版本在不断的更替,他是一句时间字段和主键对该表进行约束的我们可以在设计表的过程中声明时态表的时间和主键
当然我们也可以声明时态视图如下图案例:
表示一个实时变化的全球钞票的汇率的变化图我们首先建立一张时态表如下:
经过sql查询得到的结果为:
也可以建立临时视图来对数据进行展现:
像这样我们就可以依据时间和主键的约束获取到不同时间点下对应的版本数据了:
例如在11:00:00
对应的版本,表的内容如下所示:
如果我们想输出 versioned_rates
表在 12:00:00
对应的版本,表的内容如下所示:
2:flink打宽数据的三种方式(join)
2.1:双流join
可以将双流join理解为我们最常用的hive或其他关系型数据库中的join方式,像left join或inner join一样所以也常称为常规join,任何新记录或对 Join 两侧表的任何更改都是可见的,并会影响最终整个 Join 的结果。例如,如果 Join 左侧插入了一条新的记录,那么它将会与 Join 右侧过去与将来的所有记录进行 Join 运算如下示例:
SELECT * FROM Orders INNER JOIN Product ON Orders.productId = Product.id
2.2:区间join
join的范围在一个指定的区间范围内就成之为区间join,要求一张表内的时间精准的落在另一张表的一定时间范围内让计算的数据量保持在一定的时间范围内,但是使用的场景要收到限制时间区间 Join 只支持带有时间属性的递增表。由于时间属性是单调递增的,Flink 可以从状态中移除过期的数据,而不会影响结果的正确性(还没有找到真正的实现场景)
SELECT *
FROM
Orders o,
Shipments s
WHERE o.id = s.orderId AND
o.ordertime BETWEEN s.shiptime - INTERVAL '4' HOUR AND s.shiptime
2.2:时态join
时态表和临时表的区别
个人理解为:
1:时态表多为从外部接入到flink中进行计算表他有对应的版本依据时间和主键来进行版本的确定,随着时间的变化版本会进行迭代,而临时表相当于我们在flink-cli中通过对多路数据的统计计算得到的一张存在flink中的汇总数据表,他会实时的发生变化但是生命周期是一个session的会话窗口,session结束数据就不存在了。
2:时态表join的结构
左边:左边会触发结果更新,输出流保持时间属性
右边:时态表(维表)或者hive的分区表
定义方式:
左表的一个事件事件或者行为时间会作为版本控制的依据,时态表的版本会收到该时间的限制,在每条数据进行join的时候会获取对应左表与之对应的版本数据,减少范围增加资源的使用率。