• Flink Interval Join,Temporal Join,Lookup Join区别


    Flink Interval Join,Temporal Join,Lookup Join区别

    Interval Join 间隔关联

    Interval Join 多用于事件时间,如双流join中一条流关联另一条流在指定间隔时间内的记录,使用方法如下:

    SELECT *
    FROM Orders o, Shipments s
    WHERE o.id = s.order_id
    AND o.order_time BETWEEN s.ship_time - INTERVAL '4' HOUR AND s.ship_time
    
    • 1
    • 2
    • 3
    • 4

    Temporal Join 时态关联

    temporal join牵扯到一个很重要的概念,叫temporal table(时态表)或dynamic table(动态表) ,时态表中的行与一个或多个时态周期相关联,并且所有 Flink 表都是时态的(动态的)。时态表包含一个或多个版本化的表快照,它可以是一个跟踪变更的变更历史表(例如数据库变更日志,包含所有快照) ,也可以是一个实现变更的变更维度表(例如包含最新快照的数据库表)。

    Flink SQL 流批一体的核心是:流表二象性。围绕这一核心有若干概念,例如,动态表(Dynamic Table)/时态表(Temporal Table)、版本(Version)、版本表(Version Table)、普通表、连续查询、物化视图/虚拟视图、CDC(Change Data Capture)、Changelog Stream。

    • 版本: 时态表可以划分成一系列带版本的表快照集合,表快照中的版本代表了快照中所有记录的有效区间,有效区间的开始时间和结束时间可以通过用户指定,根据时态表是否可以追踪自身的历史版本与否,时态表可以分为 版本表 和 普通表。
    • 版本表: 如果时态表中的记录可以追踪和并访问它的历史版本,这种表我们称之为版本表,来自数据库的 changelog 可以定义成版本表。
    • 普通表: 如果时态表中的记录仅仅可以追踪并和它的最新版本,这种我们称之为普通表,来自数据库 或 HBASE的表可以定义成普通表。

    Event Time Temporal Join

    使用事件时间属性(即 rowtime 属性) ,可以像过去的某个时刻那样检索键的值。这允许在一个公共时间点连接两个表。版本化的表将存储自上一个水印以来的所有版本(按时间标识)。

    -- Create a table of orders. This is a standard
    -- append-only dynamic table.
    CREATE TABLE orders (
        order_id    STRING,
        price       DECIMAL(32,2),
        currency    STRING,
        order_time  TIMESTAMP(3),
        WATERMARK FOR order_time AS order_time
    ) WITH (/* ... */);
    
    -- Define a versioned table of currency rates. 
    -- This could be from a change-data-capture
    -- such as Debezium, a compacted Kafka topic, or any other
    -- way of defining a versioned table. 
    CREATE TABLE currency_rates (
        currency STRING,
        conversion_rate DECIMAL(32, 2),
        update_time TIMESTAMP(3) METADATA FROM `values.source.timestamp` VIRTUAL,
        WATERMARK FOR update_time AS update_time,
        PRIMARY KEY(currency) NOT ENFORCED
    ) WITH (
        'connector' = 'kafka',
        'value.format' = 'debezium-json',
       /* ... */
    );
    
    SELECT 
         order_id,
         price,
         currency,
         conversion_rate,
         order_time
    FROM orders
    LEFT JOIN currency_rates FOR SYSTEM_TIME AS OF orders.order_time
    ON orders.currency = currency_rates.currency;
    
    order_id  price  currency  conversion_rate  order_time
    ========  =====  ========  ===============  =========
    o_001     11.11  EUR       1.14             12:00:00
    o_002     12.51  EUR       1.10             12:06:00
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    Processing Time Temporal Join

    处理时间时态表联接使用处理时间属性将行与外部版本化表中的键的最新版本相关联。处理时间时态连接最常用于使用外部表(即维度表)丰富流。

    Lookup Join 查找关联

    Lookup Join通常用于使用从外部系统查询的数据来丰富表。联接需要一个表具有处理时间属性,另一个表由查找源连接器支持。作用和Processing Time Temporal Join类似,写法有相同

    CREATE TABLE orders (
        order_id    STRING,
        price       DECIMAL(32,2),
        total       DECIMAL(32,2),
        currency    STRING,
        order_time  TIMESTAMP(3),
        proc_time as PROC_TIME()
    ) WITH (/* ... */);
    -- Customers is backed by the JDBC connector and can be used for lookup joins
    CREATE TEMPORARY TABLE Customers (
      id INT,
      name STRING,
      country STRING,
      zip STRING
    ) WITH (
      'connector' = 'jdbc',
      'url' = 'jdbc:mysql://mysqlhost:3306/customerdb',
      'table-name' = 'customers'
    );
    
    -- enrich each order with customer information
    SELECT o.order_id, o.total, c.country, c.zip
    FROM Orders AS o
      JOIN Customers FOR SYSTEM_TIME AS OF o.proc_time AS c
        ON o.customer_id = c.id;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
  • 相关阅读:
    怎么把录音转换成mp3格式?
    20231120进程优先级和调度策略
    Webmin -- Webmin Users
    记录一次SQL函数和优化的问题
    算法学习-记忆化搜索(持续更新中)
    聊跨境:一年增长60%!人人都说跨境电商难做,但红利仍在(Starday)
    最佳实践-SQL语法校验
    《纳瓦尔宝典》和一个智者的对话的奇妙旅程
    【小爱学大数据】FlinkKafkaConsumer
    JAVA设计模式1:单例模式,确保每个类只能有一个实例
  • 原文地址:https://blog.csdn.net/weixin_44624060/article/details/126278220