Versioned Merge Engine

本文介绍合并引擎(Merge Engine )中的Versioned Merge Engine用法。

Versioned Merge Engine说明

  • 合并策略

    基于版本号或事件时间戳进行合并,保留每个主键对应的最高版本或最新时间戳的记录。

  • 配置方式

    在创建表时,通过设置表属性'table.merge-engine' = 'versioned'来启用。

  • 更新机制

    • 仅当新传入记录的指定字段值(如版本号)大于或等于当前存储值时,才会执行更新。

    • 若新值小于现有值或为NULL,则不触发更新 。

  • 适用场景

    • 适用于数据去重和乱序数据合并,作为流式计算中“去重转换”的有效替代方案。

    • 可确保与上游数据的最终一致性,即在一定时间窗口内,系统能自动修复数据差异,达到一致状态。

  • 使用限制

    • 不支持UPDATEDELETE操作。

    • 不支持部分更新。

    • 变更日志中的UPDATE_BEFOREDELETE事件将被自动忽略。

使用示例

版本列

版本列是表中存储数据记录版本号(或事件时间戳)的列,用于标识每条记录的唯一性,是启用Versioned Merge Engine的必要条件。

'table.merge-engine' = 'versioned',
'table.merge-engine.versioned.ver-column' = '<列名>'

版本列支持的数据类型:

  • INT

  • BIGINT

  • TIMESTAMP

  • TIMESTAMP(p)(带精度)

  • TIMESTAMP_LTZ(本地时区时间戳)

  • TIMESTAMP_LTZ(p)(带精度的本地时区时间戳)

SQL示例

CREATE TABLE VERSIONED (
    a INT NOT NULL PRIMARY KEY NOT ENFORCED,
    b STRING, 
    ts BIGINT
 ) WITH (
    'table.merge-engine' = 'versioned',
    'table.merge-engine.versioned.ver-column' = 'ts'
);

INSERT INTO VERSIONED (a, b, ts) VALUES (1, 'v1', 1000);

-- 插入ts < 1000的数据,不会更新
INSERT INTO VERSIONED (a, b, ts) VALUES (1, 'v2', 999);
SELECT * FROM VERSIONED WHERE a = 1;
-- 输出
-- +---+-----+------+
-- | a | b   | ts   |
-- +---+-----+------+
-- | 1 | v1  | 1000 |
-- +---+-----+------+


-- 插入ts > 1000的数据,会更新
INSERT INTO VERSIONED (a, b, ts) VALUES (1, 'v3', 2000);
SELECT * FROM VERSIONED WHERE a = 1;
-- 输出
-- +---+-----+------+
-- | a | b   | ts   |
-- +---+-----+------+
-- | 1 | v3  | 2000 |
-- +---+-----+------+

-- 插入ts为null的数据,不会更新
INSERT INTO VERSIONED (a, b, ts) VALUES (1, 'v4', CAST(null as BIGINT));
SELECT * FROM VERSIONED WHERE a = 1;
-- 输出
-- +---+-----+------+
-- | a | b   | ts   |
-- +---+-----+------+
-- | 1 | v3  | 2000 |
-- +---+-----+------+