flink时间属性类型,以及如何定义
处理时间(ProcessTime)
**概念:**指的是flink算子执行具体操作时的机器时间
- 处理时间属性可以在创建表的 DDL 中用计算列的方式定义,用 PROCTIME() 就可以定义处理时间。
- 处理时间是基于机器的本地时间来处理数据,它既不需要从数据里获取时间,也不需要生成watermark
在SQL中生成、定义:
语法:proctime AS PROCTIME()
CREATE TABLE orders (
order_id STRING,
price DECIMAL(32,2),
user_id STRING,
order_time TIMESTAMP(3),
proctime AS PROCTIME() -- 新增处理时间属性字段proctime,proctime可正常通过orders表引用
) WITH (
'connector' = 'kafka',
'topic' = 'order',
'properties.bootstrap.servers' = 'localhost:9092',
'properties.group.id' = 'testGroup',
'scan.startup.mode' = 'earliest-offset',
'format' = 'json'
)
事件时间(EventTime)
概念: 指的是数据本身携带的时间。这个时间是在事件产生时的时间,事件时间属性可以通过 WATERMARK语句进行定义,事件时间会有乱序和延时到达的问题。
- 事件时间允许程序按照数据中包含的时间来处理,这样可以在有乱序或者延迟的数据的情况下产生一致的处理结果。
- 它可以保证从外部存储读取数据后产生可以复现(replayable)的结果。
在SQL中生成、定义:
事件时间字段必须是TIMESTAMP(3)类型
语法: WATERMARK FOR {column} AS {alias} - INTERVAL 5 SECOND
CREATE TABLE orders (
order_id STRING,
price DECIMAL(32,2),
user_id STRING,
order_time AS cast(CURRENT_TIMESTAMP as timestamp(3)),
-- 此处是将order_time作为事件时间,并且设置延迟5s
WATERMARK FOR order_time AS order_time - INTERVAL 5 SECOND
) WITH (
'connector' = 'kafka',
'topic' = 'order',
'properties.bootstrap.servers' = 'localhost:9092',
'properties.group.id' = 'testGroup',
'scan.startup.mode' = 'earliest-offset',
'format' = 'json'
)
flink sql中指定时间字段
-
通过
proctime AS PROCTIME()
指定处理时间proctime AS PROCTIME() -- 新增处理时间属性字段proctime,proctime可正常通过orders表引用
-
通过
WATERMARK FOR
指定事件时间WATERMARK FOR eventTime as eventTime - INTERVAL '5' SECOND -- eventTime列作为水位线,并且延迟5秒
-
通过
FOR SYSTEM_TIME AS OF
指定使用
FOR SYSTEM_TIME AS OF table1.proctime
表示当左边表的记录与右边的维表join时,只匹配当前处理时间维表所对应的的快照数据(即关联维表当前最新的状态)在Temporal Table Join关联中,维表可能会不断变化,JOIN行为发生后,维表中的数据发生了变化(新增、更新或删除),已关联的维表数据不会被同步变化。
SELECT column-names FROM table1 [AS <alias1>] [LEFT] JOIN table2 FOR SYSTEM_TIME AS OF table1.proctime [AS <alias2>] ON table1.column-name1 = table2.key-name1 select t1.* from ( --临时队列 select *,PROCTIME() as proctime from real_tmp_order_info_from_kafka )t1 left join real_dim_order_info_to_hbase FOR SYSTEM_TIME AS OF t1.proctime t2 --维度关联最新订单状态 on t1.order_id = t2.order_id