本文介绍合并引擎(Merge Engine )中的Versioned Merge Engine用法。
Versioned Merge Engine说明
合并策略
基于版本号或事件时间戳进行合并,保留每个主键对应的最高版本或最新时间戳的记录。
配置方式
在创建表时,通过设置表属性
'table.merge-engine' = 'versioned'
来启用。更新机制
仅当新传入记录的指定字段值(如版本号)大于或等于当前存储值时,才会执行更新。
若新值小于现有值或为NULL,则不触发更新 。
适用场景
适用于数据去重和乱序数据合并,作为流式计算中“去重转换”的有效替代方案。
可确保与上游数据的最终一致性,即在一定时间窗口内,系统能自动修复数据差异,达到一致状态。
使用限制
不支持UPDATE和DELETE操作。
不支持部分更新。
变更日志中的UPDATE_BEFORE和DELETE事件将被自动忽略。
使用示例
版本列
版本列是表中存储数据记录版本号(或事件时间戳)的列,用于标识每条记录的唯一性,是启用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 |
-- +---+-----+------+
该文章对您有帮助吗?