flink中的时间属性

1:时间的几种类型(官网概念)

1.1处理时间

指的是执行具体操作时的机器时间(大家熟知的绝对时间, 例如 Java的 System.currentTimeMillis()) )

在ddl语句中声明一个处理时间:

CREATE TABLE user_actions (
  user_name STRING,
  data STRING,
  user_action_time AS PROCTIME() -- 声明一个额外的列作为处理时间属性,这个事件是系统计算的时间,不需要从我们的源头数据进行提供只需要声明
) WITH (
  ...
);

1.2事件事件

指的是执行具体操作时的机器时间(大家熟知的绝对时间, 例如 Java的 System.currentTimeMillis()) )

在ddl语句中声明一个事件事件并设置水位线为5秒

CREATE TABLE user_actions (
 user_name STRING,
 data STRING,
 ts BIGINT,
 time_ltz AS TO_TIMESTAMP_LTZ(ts, 3),
 -- declare time_ltz as event time attribute and use 5 seconds delayed watermark strategy
 WATERMARK FOR time_ltz AS time_ltz - INTERVAL '5' SECOND
) WITH (
 ...
);

Flink 支持在 TIMESTAMP 列和 TIMESTAMP_LTZ 列上定义事件时间

1:timestamp    字符串类型的时间例如2021-07-17 00:00:00.0

        1.1函数TO_TIMESTAMP():将 ‘UTC+0’ 时区下格式为 string2(默认为:‘yyyy-MM-dd HH:mm:ss’)的字符串 string1 转换为时间戳,例如TO_TIMESTAMP(FROM_UNIXTIME(app_time /1000,'yyyy-MM-dd HH:mm:ss')),将毫秒转化为timestamp类型。

2:TIMESTAMP_LTZ  返回16位的unix时间

        2.1函数TO_TIMESTAMP_LTZ() 将纪元秒或纪元毫秒转换为 TIMESTAMP_LTZ,有效精度为 0 或 3,0 代表 TO_TIMESTAMP_LTZ(epochSeconds, 0), 3 代表 TO_TIMESTAMP_LTZ(epochMilliseconds, 3)。        

3:其他:

2:时间窗口

flink提供了三种窗口函数分别是滚动窗口

2.1:滚动窗口

        滚动串口可以理解为批处理,也可以理解为一个特殊的滑动窗口因为他的窗口大小和滑动步长保持一直,隔一段事件就会进行窗口的滚动,计算出一个时间跨度内数据的变化,如果步长设置的过大我们的滑动窗口就会变成批处理,在实时处理场景下应用有一定的局限性具体还要看公司的业务场景:

 滚动窗口有三个必填参数一个可选参数

  • data:是一个表参数,可以是与时间属性列的任何关系。
  • timecol:是一个列描述符,指示应将数据的哪个时间属性列映射到翻滚窗口。
  • size:是指定翻滚窗口宽度的持续时间。
  • offset:是一个可选参数,用于指定窗口启动将移动的偏移量
TUMBLE(TABLE data, DESCRIPTOR(timecol), size [, offset ])

如果我们想使用一个滚动窗口首先要通过ddl语句创建一个带有时间属性的表

依据处理时间创建ddl语句

CREATE TABLE bid(
  user_name STRING,
  data STRING,
  user_action_time AS PROCTIME() -- 声明一个额外的列作为处理时间属性
) WITH (
  ...
);

旧版本的写法:
SELECT TUMBLE_START(user_action_time, INTERVAL '10' MINUTE), COUNT(DISTINCT user_name)
FROM user_actions
GROUP BY TUMBLE(user_action_time, INTERVAL '10' MINUTE);

成功创建这张表之后可以对现有数据进行sql查询依据滚动窗口

Flink SQL> SELECT * FROM TABLE(
   TUMBLE(TABLE Bid, DESCRIPTOR(bidtime), INTERVAL '10' MINUTES));
-- or with the named params
-- note: the DATA param must be the first
Flink SQL> SELECT * FROM TABLE(
   TUMBLE(
     DATA => TABLE Bid,
     TIMECOL => DESCRIPTOR(bidtime),
     SIZE => INTERVAL '10' MINUTES));
+------------------+-------+------+------------------+------------------+-------------------------+
|          bidtime | price | item |     window_start |       window_end |            window_time  |
+------------------+-------+------+------------------+------------------+-------------------------+
| 2020-04-15 08:05 |  4.00 | C    | 2020-04-15 08:00 | 2020-04-15 08:10 | 2020-04-15 08:09:59.999 |
| 2020-04-15 08:07 |  2.00 | A    | 2020-04-15 08:00 | 2020-04-15 08:10 | 2020-04-15 08:09:59.999 |
| 2020-04-15 08:09 |  5.00 | D    | 2020-04-15 08:00 | 2020-04-15 08:10 | 2020-04-15 08:09:59.999 |
| 2020-04-15 08:11 |  3.00 | B    | 2020-04-15 08:10 | 2020-04-15 08:20 | 2020-04-15 08:19:59.999 |
| 2020-04-15 08:13 |  1.00 | E    | 2020-04-15 08:10 | 2020-04-15 08:20 | 2020-04-15 08:19:59.999 |
| 2020-04-15 08:17 |  6.00 | F    | 2020-04-15 08:10 | 2020-04-15 08:20 | 2020-04-15 08:19:59.999 |
+------------------+-------+------+------------------+------------------+-------------------------+

依据窗口大小来对表数据进行分组查询

Flink SQL> SELECT window_start, window_end, SUM(price)
  FROM TABLE(
    TUMBLE(TABLE Bid, DESCRIPTOR(bidtime), INTERVAL '10' MINUTES))
  GROUP BY window_start, window_end;
+------------------+------------------+-------+
|     window_start |       window_end | price |
+------------------+------------------+-------+
| 2020-04-15 08:00 | 2020-04-15 08:10 | 11.00 |
| 2020-04-15 08:10 | 2020-04-15 08:20 | 10.00 |
+------------------+------------------+-------+

使用窗口查询的时候flink会为表增加三个新字段分别是:

window_start:窗口开始时间

window_end:窗口结束时间

window_time:窗口计算时间

可以在我们完成相关业务逻辑的时候为我们的分析提供一定的支持

2.2:滑动窗口

滑动窗口区别于滚动窗口,或者说包含滚动窗口,滑动窗口类似于一个滑块他会以一定的窗口大小按照一个长度的时间步长在时间线上滑动,先比较于滚动窗口而言,滚动窗口是不存在重复数据的但是滑动窗口因为设置的步长小于窗口长度所以会导致产生重复数据。

 和滚动窗口相同滑动窗口同样会产生三个字段

window_start:窗口开始时间

window_end:窗口结束时间

window_time:窗口计算时间

使用滑动窗口的函数名称为HOP,构成为四个必须参数和一个可选参数

HOP(TABLE data, DESCRIPTOR(timecol), slide, size [, offset ])
-- NOTE: Currently Flink doesn't support evaluating individual window table-valued function,
--  window table-valued function should be used with aggregate operation,
--  this example is just used for explaining the syntax and the data produced by table-valued function.
> SELECT * FROM TABLE(
    HOP(TABLE Bid, DESCRIPTOR(bidtime), INTERVAL '5' MINUTES, INTERVAL '10' MINUTES));
-- or with the named params
-- note: the DATA param must be the first
> SELECT * FROM TABLE(
    HOP(
      DATA => TABLE Bid,
      TIMECOL => DESCRIPTOR(bidtime),
      SLIDE => INTERVAL '5' MINUTES,
      SIZE => INTERVAL '10' MINUTES));
+------------------+-------+------+------------------+------------------+-------------------------+
|          bidtime | price | item |     window_start |       window_end |           window_time   |
+------------------+-------+------+------------------+------------------+-------------------------+
| 2020-04-15 08:05 |  4.00 | C    | 2020-04-15 08:00 | 2020-04-15 08:10 | 2020-04-15 08:09:59.999 |
| 2020-04-15 08:05 |  4.00 | C    | 2020-04-15 08:05 | 2020-04-15 08:15 | 2020-04-15 08:14:59.999 |
| 2020-04-15 08:07 |  2.00 | A    | 2020-04-15 08:00 | 2020-04-15 08:10 | 2020-04-15 08:09:59.999 |
| 2020-04-15 08:07 |  2.00 | A    | 2020-04-15 08:05 | 2020-04-15 08:15 | 2020-04-15 08:14:59.999 |
| 2020-04-15 08:09 |  5.00 | D    | 2020-04-15 08:00 | 2020-04-15 08:10 | 2020-04-15 08:09:59.999 |
| 2020-04-15 08:09 |  5.00 | D    | 2020-04-15 08:05 | 2020-04-15 08:15 | 2020-04-15 08:14:59.999 |
| 2020-04-15 08:11 |  3.00 | B    | 2020-04-15 08:05 | 2020-04-15 08:15 | 2020-04-15 08:14:59.999 |
| 2020-04-15 08:11 |  3.00 | B    | 2020-04-15 08:10 | 2020-04-15 08:20 | 2020-04-15 08:19:59.999 |
| 2020-04-15 08:13 |  1.00 | E    | 2020-04-15 08:05 | 2020-04-15 08:15 | 2020-04-15 08:14:59.999 |
| 2020-04-15 08:13 |  1.00 | E    | 2020-04-15 08:10 | 2020-04-15 08:20 | 2020-04-15 08:19:59.999 |
| 2020-04-15 08:17 |  6.00 | F    | 2020-04-15 08:10 | 2020-04-15 08:20 | 2020-04-15 08:19:59.999 |
| 2020-04-15 08:17 |  6.00 | F    | 2020-04-15 08:15 | 2020-04-15 08:25 | 2020-04-15 08:24:59.999 |
+------------------+-------+------+------------------+------------------+-------------------------+

如上图每间隔五分钟窗口会进行一次统计,之后开启另一个长度为10的窗口,起始位置滑动完五分钟的位置。

2.3:累计窗口

        累计窗口flink新版本推出的另一种窗口形式,相比于滑动和滚动串口,累计窗口在一些应用场景还是十分有用的,比如设想一种场景,业务需求在每天24小时内每分钟计算一次当日的pv数或者uv数,以累加的方式进行计算一分钟计算出一个具体的数值,窗口长度为24小时,为了应对这种情况累计窗口应运而生:

 时间属性依然包含"window_start"、"window_end"、"window_time"的附加 3 列

函数名称CUMULATE采用四个必需参数,一个可选参数:

CUMULATE(TABLE data, DESCRIPTOR(timecol), step, size)
  • data:是一个表参数,可以是与时间属性列的任何关系。
  • timecol:是一个列描述符,指示应将数据的哪个时间属性列映射到翻滚窗口。
  • step:是指定在顺序累积窗口结束之间增加的窗口大小的持续时间。
  • size:是指定累积窗口的最大宽度的持续时间。 必须是 的整数倍。sizestep
  • offset:是一个可选参数,用于指定窗口启动将移动的偏移量。

未完待续。。。。

<think>好的,用户想了解Flink SQL中时间函数的使用方法和示例。首先我需要回忆一下Flink SQL支持的时间函数,包括系统内置的和自定义的可能。根据提供的引用内容,特别是引用[2]提到了窗口函数和其他常见函数,引用[4]提到了自定义函数的使用,但用户的问题主要聚焦于时间函数,可能需要涉及处理时间、事件时间以及相关的窗口操作。 首先,系统内置的时间函数包括CURRENT_TIMESTAMP、DATE_FORMAT、EXTRACT等,这些是基础的时间处理函数。然后,时间属性Flink中分为处理时间和事件时间,用户可能需要知道如何定义这两种时间属性,例如在DDL中指定或者通过PROCTIME()函数。 接下来是窗口函数,比如TUMBLE、HOP、SESSION等,这些在流处理中非常重要。需要给出具体的SQL示例,展示如何将时间字段作为窗口参数,并配合聚合函数使用。例如,TUMBLE_START和TUMBLE_END来获取窗口的开始和结束时间。 另外,用户可能需要了解如何将字符串转换为时间类型,或者提取时间的某个部分,比如年、月、日等。这里可能需要用到TO_TIMESTAMP和EXTRACT函数。 还需要注意,在引用中提到自定义函数的注册和使用,例如引用[2]中的hashcode函数,但时间函数主要是内置的,不过如果有自定义的时间处理需求,可能需要用到UDF,但用户的问题可能更关注内置函数。 此外,引用[3]和[4]提到Flink SQL的自定义函数加载和解析,但用户的问题不涉及自定义函数,所以可能不需要深入这部分,除非用户的问题扩展到自定义时间处理函数,但目前应集中在系统内置函数。 需要检查是否有遗漏的时间函数,比如INTERVAL的使用,或者时间差计算函数DATEDIFF等。同时,可能需要给出水印设置的例子,因为事件时间处理通常需要水印,这涉及到时间属性的定义。 最后,需要确保示例的正确性,比如在DDL中定义时间字段、指定水印,以及在查询中使用窗口函数和聚合。同时,要提醒用户关于时间函数在使用时的一些注意事项,比如时区处理,或者时间格式的正确性。 总结回答结构:先介绍时间函数分类,再分点讲解内置函数、时间属性定义、窗口函数,每个部分给出示例,最后注意事项。确保使用正确的$$...$$格式和行内$...$,并生成相关问题。</think>### Flink SQL 时间函数用法详解 #### 一、时间函数分类 Flink SQL 的时间函数主要分为以下几类: 1. **系统内置时间函数**:如 `CURRENT_TIMESTAMP`、`DATE_FORMAT`、`EXTRACT` 等 2. **时间属性定义函数**:用于指定事件时间(Event Time)或处理时间(Processing Time) 3. **窗口函数**:与时间窗口相关的 `TUMBLE`、`HOP`、`SESSION` 等 --- #### 二、内置时间函数示例 1. **获取当前时间** ```sql SELECT CURRENT_TIMESTAMP AS current_ts; -- 返回格式: 2023-09-15 14:30:00.123 ``` 2. **时间格式转换** ```sql SELECT DATE_FORMAT(ts, 'yyyy-MM-dd HH:mm') AS formatted_ts, -- 将时间戳格式化为字符串 TO_TIMESTAMP('2023-09-15 14:30:00', 'yyyy-MM-dd HH:mm:ss') AS converted_ts -- 字符串转时间戳 FROM events; ``` 3. **时间提取** ```sql SELECT EXTRACT(YEAR FROM ts) AS year, EXTRACT(HOUR FROM ts) AS hour FROM events; ``` --- #### 三、时间属性定义 在 Flink DDL 中定义时间属性: ```sql CREATE TABLE sensor ( id STRING, ts BIGINT, -- 将ts字段转换为TIMESTAMP类型,并声明为事件时间 event_time AS TO_TIMESTAMP(FROM_UNIXTIME(ts / 1000)), WATERMARK FOR event_time AS event_time - INTERVAL '5' SECOND -- 定义水位线 ) WITH (...); ``` --- #### 四、窗口函数使用 1. **滚动窗口示例** ```sql SELECT TUMBLE_START(event_time, INTERVAL '1' HOUR) AS window_start, COUNT(id) AS cnt FROM sensor GROUP BY TUMBLE(event_time, INTERVAL '1' HOUR); ``` 2. **滑动窗口示例** ```sql SELECT HOP_START(event_time, INTERVAL '5' MINUTE, INTERVAL '15' MINUTE) AS window_start, AVG(temperature) AS avg_temp FROM sensor GROUP BY HOP(event_time, INTERVAL '5' MINUTE, INTERVAL '15' MINUTE); ``` --- #### 五、时间间隔计算 ```sql SELECT DATEDIFF(ts1, ts2) AS day_diff, -- 计算两个时间戳的天数差 TIMESTAMPDIFF(MINUTE, start_time, end_time) AS minute_diff FROM time_table; ``` --- #### 六、注意事项 1. 事件时间必须配合 `WATERMARK` 定义使用[^2] 2. 处理时间可通过 `PROCTIME()` 函数直接声明: ```sql SELECT id, PROCTIME() AS process_time FROM sensor; ``` 3. 时区设置需通过 `table.local-time-zone` 配置参数统一管理 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值