簡單的說 ReplacingMergeTree 可以實現數據的 ‘修改’
修改的原理是merge的時候保留大版本號的數據。
創建 ReplacingMergeTree 引擎表
create table test.replacingTable (create_time Date, id UInt16, primaryKey String, version UInt16)
ENGINE=ReplacingMergeTree(version)
PARTITION BY toYYYYMM(create_time)
ORDER BY (primaryKey)
SETTINGS index_granularity = 8192;
插入模擬數據
insert into test.replacingTable (create_time, id, primaryKey, version) values ('2020-05-26', 1, 'hagrid', 10);
insert into test.replacingTable (create_time, id, primaryKey, version) values ('2020-05-26', 1, 'hagrid', 20);
insert into test.replacingTable (create_time, id, primaryKey, version) values ('2020-05-27', 1, 'hagrid', 30);
查詢數據
select * from test.replacingTable
發現數據並沒有修改
手動觸發merge
optimize table test.replacingTable;
再次查詢發現數據已經更新
ps: 發現一個有趣的現象,我在測試中發現,當使用批量插入數據的時候,哪怕手動觸發了merge 數據也沒有更新。
當我再次插入一條數據後執行merge,數據更新成功。
這裏懷疑 ReplacingMergeTree 在執行merge操作的時候,對同一批來的數據有merge的策略,簡單的說就是merge的操作懶執行,需要新數據插入作爲事件驅動(懷疑未驗證)。