维表是数仓中的一个概念,维表中的维度属性是观察数据的角度,在建设离线数仓的时候,通常是将维表与事实表进行关联构建星型模型。在实时数仓中,同样也有维表与事实表的概念,其中事实表通常存储在kafka中,维表通常存储在外部设备中(比如MySQL,HBase)。对于每条流式数据,可以关联一个外部维表数据源,为实时计算提供数据关联查询。维表可能是会不断变化的,在维表JOIN时,需指明这条记录关联维表快照的时刻。需要注意是,目前Flink SQL的维表JOIN仅支持对当前时刻维表快照的关联(处理时间语义),而不支持事实表rowtime所对应的的维表快照(事件时间语义)。通过本文你可以了解到:
- 如何使用Flink SQL创建表
- 如何定义Kafka数据源表
- 如何定义MySQL数据源表
- 什么是Temporal Table Join
- 维表join的案例
Flink SQL创建表
注意:本文的所有操作都是在Flink SQL cli中进行的
创建表的语法
CREATE TABLE [catalog_name.][db_name.]table_name
(
{ <column_definition> | <computed_column_definition> }[ , ...n]
[ <watermark_definition> ]
)
[COMMENT table_comment]
[PARTITIONED BY (partition_column_name1, partition_column_name2, ...)]
WITH (key1=val1, key2=val2, ...)
-- 定义表字段
<column_definition>:
column_name column_type [COMMENT column_comment]
-- 定义计算列
<computed_column_definition>:
column_name AS computed_column_expression [COMMENT column_comment]
-- 定义水位线
<watermark_definition>:
WATERMARK FOR rowtime_column_name AS watermark_strategy_expression
解释
COMPUTED COLUMN(计算列)
计算列是一个通过column_name AS computed_column_expression
生成的虚拟列,产生的计算列不是物理存储在数据源表中。一个计算列可以通过原有数据源表中的某个字段、运算符及内置函数生成。比如,定义一个消费金额的计算列(cost),可以使用表的价格(price)*数量(quantity)计算得到。
计算列常常被用在定义时间属性(见另一篇文章Flink Table API&SQL编程指南之时间属性(3),可以通过PROCTIME()函数定义处理时间属性,语法为proc AS PROCTIME()
。除此之外,计算列可以被用作提取事件时间列,因为原始的事件时间可能不是TIMESTAMP(3)类型或者是存在JSON串中。
尖叫提示:
1.在源表上定义计算列,是在读取数据源之后计算的,计算列需要跟在SELECT查询语句之后;
2.计算列不能被INSERT语句插入数据,在INSERT语句中,只能包括实际的目标表的schema,不能包括计算列
水位线
水位线定义了表的事件时间属性,其语法为:
WATERMARK FOR rowtime_column_name AS watermark_strategy_expression
其中rowtime_column_name
表示表中已经存在的事件时间字段,值得注意的是,该事件时间字段必须是TIMESTAMP(3)类型,即形如yyyy-MM-dd HH:mm:ss
,如果不是这种形式的数据类型,需要通过定义计算列进行转换。
watermark_strategy_expression
定义了水位线生成的策略,该表达式的返回数据类型必须是TIMESTAMP(3)类型。
Flink提供了许多常用的水位线生成策略:
-
严格单调递增的水位线:语法为
WATERMARK FOR rowtime_column AS rowtime_column
即直接使用时间时间戳作为水位线
-
递增水位线:语法为
WATERMARK FOR rowtime_column AS rowtime_column - INTERVAL '0.001' SECOND
-
乱序水位线:语法为
WATERMARK FOR rowtime_column AS rowtime_column - INTERVAL 'string' timeUnit -- 比如,允许5秒的乱序 WATERMARK FOR rowtime_column AS rowtime_column - INTERVAL '5' SECOND
分区
根据具体的字段创建分区表,每一个分区会对应一个文件路径
WITH 选项
创建Table source或者Table sink需要指定表的属性,属性是以key/value的形式配置的,具体参考其相对应的connector
<