Flink总共有三种时间语义:Processing time(处理时间)、Event time(事件时间)以及Ingestion time(摄入时间)。关于这些时间语义的具体解释,可以参考另一篇文章Flink的时间与watermarks详解。本文主要讲解Flink Table API & SQL中基于时间的算子如何定义时间语义。通过本文你可以了解到:时间属性的简介
处理时间
事件时间
时间属性简介
Flink TableAPI&SQL中的基于时间的操作(如window),需要指定时间语义,表可以根据指定的时间戳提供一个逻辑时间属性。
时间属性是表schama的一部分,当使用DDL创建表时、DataStream转为表时或者使用TableSource时,会定义时间属性。一旦时间属性被定义完成,该时间属性可以看做是一个字段的引用,从而在基于时间的操作中使用该字段。
时间属性像一个时间戳,可以被访问并参与计算,如果一个时间属性参与计算,那么该时间属性会被雾化成一个常规的时间戳,常规的时间戳不能与Flink的时间与水位线兼容,不能被基于时间的操作所使用。
Flink TableAPI & SQL所需要的时间属性可以通过Datastream程序中指定,如下:final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime); // 默认
// 可以选择:
// env.setStreamTimeCharacteristic(TimeCharacteristic.IngestionTime);
// env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
处理时间
基于本地的机器时间,是一种最简单的时间语义,但是不能保证结果一致性,使用该时间语义不需要提取时间戳和生成水位线。总共有三种方式定义处理时间属性,具体如下
DDL语句创建表时定义处理时间
处理时间的属性可以在DDL语句中被定义为一个计算列,需要使用PROCTIME()函数,如下所示:CREATE TABLE user_actions (
user_name STRING,
data STRING,
user_action_time AS

本文详细介绍了Flink中的处理时间和事件时间语义,包括它们的定义和使用方法。在处理时间中,通过DDL创建表、DataStream转换为Table或使用TableSource时可指定时间属性。事件时间则基于记录的时间戳,通过WATERMARK语句定义,确保一致性。文中提供了多种定义时间属性的示例。
最低0.47元/天 解锁文章
537

被折叠的 条评论
为什么被折叠?



