首页 > 大数据 > Hadoop > Flink SQL - 时间属性的介绍
在 Flink 的 Table API 和 SQL 中,基于时间的操作(例如时间窗口)需要定义相关的时间语义和时间数据来源信息。为了实现这一点,表中会提供一个逻辑上的时间字段,专门用来在表处理程序中指示时间。这个字段被称为时间属性(time attribute),它是每个表模式结构(schema)的一部分。
时间属性可以在创建表的 DDL 中直接定义为一个字段,也可以在 DataStream 转换成表时定义。一旦定义了时间属性,它就可以像普通字段一样被引用,并且可以在基于时间的操作中使用。时间属性的数据类型必须为
TIMESTAMP,它的行为类似于常规时间戳,可以直接访问并进行计算。
根据时间语义的不同,可以将时间属性定义分为事件时间(event time)和处理时间(processing time)两种情况。事件时间是指数据本身携带的时间戳,而处理时间是指数据到达 Flink 系统的时间。
在 Flink SQL 中,您可以在创建表的 DDL 语句中定义事件时间属性。这可以通过增加一个字段并使用 WATERMARK 语句来实现。例如,下面的代码片段展示了如何定义一个名为
EventTable
的表,其中
ts
字段被定义为事件时间属性,并基于
ts
设置了 5 秒的水位线延迟:
CREATE TABLE EventTable( user STRING, url STRING, ts TIMESTAMP(3), WATERMARK FOR ts AS ts - INTERVAL '5' SECOND ) WITH ( ... );
需要注意的是,时间戳类型必须是
TIMESTAMP
或者
TIMESTAMP_LTZ
类型。但是,如果时间戳是秒或者毫秒(
BIGINT
类型),则可以通过转换来使用。例如,下面的代码片段展示了如何将
BIGINT
类型的时间戳转换为
TIMESTAMP_LTZ
类型
ts BIGINT, time_ltz AS TO_TIMESTAMP_LTZ(ts, 3),
在 Flink SQL 中,您可以定义处理时间属性来表示数据到达 Flink 系统的时间。这可以通过在创建表的 DDL(
CREATE TABLE
语句)中增加一个额外的字段,并通过调用系统内置的
PROCTIME()
函数来实现。例如,下面的代码片段展示了如何定义一个名为
EventTable
的表,其中
ts
字段被定义为处理时间属性:
CREATE TABLE EventTable( user STRING, url STRING, ts AS PROCTIME() ) WITH ( ... );
需要注意的是,在定义处理时间属性时,必须要额外声明一个字段,专门用来保存当前的处理时间。这个字段可以像普通字段一样被引用,并且可以在基于时间的操作中使用。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70024433/viewspace-2967181/ ,如需转载,请注明出处,否则将追究法律责任。