实时数仓|Flink SQL之维表join

维表是数仓中的一个概念,维表中的维度属性是观察数据的角度,在建设离线数仓的时候,通常是将维表与事实表进行关联构建星型模型。在实时数仓中,同样也有维表与事实表的概念,其中事实表通常存储在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

尖叫提示

Note:创建表时指定的表名有三种形式:

(1)catalog_name.db_

你可能感兴趣的:(Flink,flink)