clickhouse的ReplacingMergeTree引擎实战
學習ReplacingMergeTree引擎,首先你得了解clickhouse的MergeTree引擎,因為ReplacingMergeTree引擎是MergeTree引擎的一個擴展版引擎,他擁有和MergeTree一樣的功能,同時新增了一個刪除相同主鍵數據的功能。
我們知道,clickhouse的MergeTree引擎,是clickhouse眾多引擎中,號稱性能最好的一個引擎,但他只能按照分區刪除數據,所以有些場景很難滿足,或者說比較麻煩,不優雅,舉個實際的例子:
比如有個系統,他的數據不是實時的,比如今天的數據,明天看會比今天多,后天看會比明天多,但你需要在你的系統中定時同步他的數據到clickhouse,
這種情況用MergeTree可以勉強實現,那就是把每天相同主鍵的數據都保存一條,查詢的時候,只取最新的一條。但這個需要寫sql解決,而且一旦查詢復雜,設計到數據合并等,sql就會變的很復雜,查詢效率也會降低,而且每天的數據都會重復保存,數據重復太多,量太大。
所以針對這種情況,我們可以考慮用clickhouse的ReplacingMergeTree引擎,這個引擎自動幫你篩選出來最新的一條數據,并刪掉之前重復的數據。類似于mongo的updateOne,先增后刪。
建表:
我們新建一個表replacing_test,用ReplacingMergeTree引擎,date作為分區鍵,id和name作為聯合主鍵,point可以理解為版本號。
value就是你實際業務要的值,我們用數字類型舉例。
這個表,相同id-name的數據,最終只會留下一條,具體留下哪一條,是由不同的point決定的。
插入測試數據
看下面的代碼,我們循環插入9*9=81條數據,聯合主鍵只有id在變,name暫時只是字符串b
public static void main(String[] args) throws SQLException {for (int i = 1;i<10;i++){for (int j = 1;j<10;j++) {int v = j+i+100;String sql = "insert into replacing_test values ('2019-12-16', "+j+", 'b',"+v+", " + System.currentTimeMillis()/1000 + ");";System.out.println(sql+"_i="+i+"_j="+j);executeSql(sql);}}}private static void executeSql(String sql) throws SQLException {ClickHouseProperties properties = new ClickHouseProperties();ClickHouseDataSource dataSource = new ClickHouseDataSource("jdbc:clickhouse://clickhouse的ip:8123/default", properties);ClickHouseConnection connection = dataSource.getConnection();ClickHouseStatement statement = connection.createStatement();boolean execute = statement.execute(sql);}結果
我們看到,最終數據庫只有11條數據,說明大部分相同主鍵的數據都被刪除了,但還是有兩條數據是重復的,分別是id為8和9的。
這個就是官網所說的,他的這個刪除重復數據,并不是一插入就刪的,而且在Merge的時候才會刪,原話是:
數據的去重只會在合并的過程中出現。合并會在未知的時間在后臺進行,因此你無法預先作出計劃。
所以說,這個引擎是一個類似于最終一致性的機制,估計是為了性能,把刪除的邏輯做成了異步。
解決重復:
其實這種也是可以解決的,如果不是很在意性能的話,可以手動執行一個sql去觸發他的Merge就好了,sql如下:
optimize table replacing_test;執行完再看結果,這個就對了。每個id-name為主鍵的數據只有最后一條。
總結
以上是生活随笔為你收集整理的clickhouse的ReplacingMergeTree引擎实战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信你scope 参数错误 php,微信
- 下一篇: [nginx报错]---unknown