Flink时间属性类型,以及如何指定

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
    
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值