tft每日頭條

 > 生活

 > clickhouse怎麼遷移曆史數據

clickhouse怎麼遷移曆史數據

生活 更新时间:2025-02-09 14:18:59

clickhouse怎麼遷移曆史數據?作者:大睿大睿,DBA,愛好減肥,瘦了30多斤,負責公司數據庫集群的管理和維護,接下來我們就來聊聊關于clickhouse怎麼遷移曆史數據?以下内容大家不妨參考一二希望能幫到您!

clickhouse怎麼遷移曆史數據(物化視圖插入時間變為)1

clickhouse怎麼遷移曆史數據

作者:大睿

大睿,DBA,愛好減肥,瘦了30多斤,負責公司數據庫集群的管理和維護。

本文來源:原創投稿

* 愛可生開源社區出品,原創内容未經授權不得随意使用,轉載請聯系小編并注明來源。


物化視圖使用to的方式寫入到存儲表中,即如下:

CREATE MATERIALIZED VIEW [IF NOT EXISTS] [db.]table_name [ON CLUSTER] TO [db.]nameAS SELECT ...

指定了存儲的表,所以物化視圖的創建也不需要指定 engine ,在查詢中,查物化視圖和查實際的存儲表得到一樣的數據,因為都是來自于同一份存儲數據。

物化視圖是計算每次寫入原表的數據,經過聚合之後寫入到目标表。比如,有按照 1s 一次記錄的明細表,同時需要按照分鐘級做數據的聚合統計pv(類似的需要),則可以通過創建物化視圖的方式将聚合後的數據寫到 1min 的表中(這種感覺有點像觸發器)

範例

1s記錄的明細表

CREATE TABLE dba_test.t_1s ( `ctime` DateTime64(0), `pv` Int64 ) ENGINE = MergeTree PARTITION BY toDate(ctime) ORDER BY ctime SETTINGS index_granularity = 8192

1min 記錄的聚合數據

CREATE TABLE dba_test.t_1m ( `ctime` DateTime64(0), `pv` Int64 ) ENGINE = summingMergeTree PARTITION BY toDate(ctime) ORDER BY ctime SETTINGS index_granularity = 8192

物化視圖t_1m_mv,查詢條件是從1s的表(t_1s),按照分鐘級(toStartOfMinute)聚合查詢結果,重新寫入到1min的表(t_1m)中

物化視圖

CREATE MATERIALIZED VIEW dba_test.t_1m_mv TO dba_test.t_1m ( `toStartOfMinute(ctime)` DateTime, `pv` Int64 ) AS SELECT toStartOfMinute(ctime), sum(pv) AS pv FROM dba_test.t_1s GROUP BY ctime

寫入測試

dba-clickhouse-001 :) insert into t_1s values('2022-01-01 00:10:01',1),('2022-01-01 00:10:01',1),('2022-01-01 00:20:01',2),('2022-01-01 00:20:01',2),('2022-01-01 00:30:01',3); INSERT INTO t_1s VALUES Query id: 0bf16844-0123-4e25-a3d4-f9b5a5c8db37 Ok. 5 rows in set. Elapsed: 0.003 sec. dba-clickhouse-001 :) select * from t_1s; SELECT * FROM t_1s Query id: cb442100-37a6-4de7-b6f3-f80f084710dc ┌───────────────ctime─┬─pv─┐ │ 2022-01-01 00:10:01 │ 1 │ │ 2022-01-01 00:10:01 │ 1 │ │ 2022-01-01 00:20:01 │ 2 │ │ 2022-01-01 00:20:01 │ 2 │ │ 2022-01-01 00:30:01 │ 3 │ └─────────────────────┴────┘ 5 rows in set. Elapsed: 0.002 sec. dba-clickhouse-001 :) select * from t_1m; SELECT * FROM t_1m Query id: f9d2d05d-8ad7-44a4-b66a-ea8c3c758f1f ┌───────────────ctime─┬─pv─┐ │ 1970-01-01 08:00:00 │ 9 │ └─────────────────────┴────┘ 1 rows in set. Elapsed: 0.002 sec.

插入的時間竟然是1970-01-01 08:00:00

開始驗證是否是查詢語句有誤

檢查物化視圖中的查詢結果是否符合預期

dba-clickhouse-001 :) SELECT :-] toStartOfMinute(ctime), :-] sum(pv) AS pv :-] FROM dba_test.t_1s :-] GROUP BY ctime; SELECT toStartOfMinute(ctime), sum(pv) AS pv FROM dba_test.t_1s GROUP BY ctime Query id: 1ecaf07e-c766-40b7-bfa2-0f87ee54abad ┌─toStartOfMinute(ctime)─┬─pv─┐ │ 2022-01-01 00:20:00 │ 4 │ │ 2022-01-01 00:30:00 │ 3 │ │ 2022-01-01 00:10:00 │ 2 │ └────────────────────────┴────┘ 3 rows in set. Elapsed: 0.002 sec.

查詢結果符合預期

直接通過insert ...select...方式确認下插入數據是否符合預期

dba-clickhouse-001 :) insert into t_1m SELECT :-] toStartOfMinute(ctime), :-] sum(pv) AS pv :-] FROM dba_test.t_1s :-] GROUP BY ctime; INSERT INTO t_1m SELECT toStartOfMinute(ctime), sum(pv) AS pv FROM dba_test.t_1s GROUP BY ctime Query id: 5db8279a-ffb1-4174-843c-80cee48b448c Ok. 0 rows in set. Elapsed: 0.002 sec. dba-clickhouse-001 :) select * from t_1m; SELECT * FROM t_1m Query id: acd79ea7-dc82-49f1-bb71-430a05895f19 ┌───────────────ctime─┬─pv─┐ │ 1970-01-01 08:00:00 │ 9 │ └─────────────────────┴────┘ ┌───────────────ctime─┬─pv─┐ │ 2022-01-01 00:10:00 │ 2 │ │ 2022-01-01 00:20:00 │ 4 │ │ 2022-01-01 00:30:00 │ 3 │ └─────────────────────┴────┘ 4 rows in set. Elapsed: 0.002 sec.

直接插入,數據正确,時間沒有被轉化。

可以确認物化視圖的查詢部分是沒有問題,那隻能是在寫入的時候出現了問題,換個思路去想一下,時間戳的開始時間是1970-01-01 00:00:00,而這裡插入的時間是1970-01-01 08:00:00多了8小時,也就是說因為時區的原因導緻時間推遲了。那會不會是因為插入的數據不規範,或者是“空”被轉化了呢。

驗證

dba-clickhouse-001 :) insert into t_1m values('',100); INSERT INTO t_1m VALUES Query id: af1785ef-dca1-467b-84c6-27f9da6547f6 Ok. 1 rows in set. Elapsed: 0.002 sec. dba-clickhouse-001 :) select * from t_1m; SELECT * FROM t_1m Query id: 34db2057-7274-4859-898e-6132f8df4465 ┌───────────────ctime─┬─pv─┐ │ 1970-01-01 08:00:00 │ 9 │ └─────────────────────┴────┘ ┌───────────────ctime─┬─pv─┐ │ 2022-01-01 00:10:00 │ 2 │ │ 2022-01-01 00:20:00 │ 4 │ │ 2022-01-01 00:30:00 │ 3 │ └─────────────────────┴────┘ ┌───────────────ctime─┬──pv─┐ │ 1970-01-01 08:00:00 │ 100 │ └─────────────────────┴─────┘ 5 rows in set. Elapsed: 0.002 sec.

果然,當插入的數據為空的時候,時間被重置了。

對比下物化視圖和目标的聚合表的結構

dba-clickhouse-001 :) desc t_1m; DESCRIBE TABLE t_1m Query id: 96c6a5ca-e42a-47e1-8212-cbcfefa6ffa4 ┌─name──┬─type──────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ │ ctime │ DateTime64(0) │ │ │ │ │ │ │ pv │ Int64 │ │ │ │ │ │ └───────┴───────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ 2 rows in set. Elapsed: 0.001 sec. dba-clickhouse-001 :) desc t_1m_mv; DESCRIBE TABLE t_1m_mv Query id: a258f6b5-f195-4386-a9bb-4ec86e7e9bd1 ┌─name───────────────────┬─type─────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ │ toStartOfMinute(ctime) │ DateTime │ │ │ │ │ │ │ pv │ Int64 │ │ │ │ │ │ └────────────────────────┴──────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ 2 rows in set. Elapsed: 0.001 sec.

聚合表時間字段名叫ctime,物化視圖的則是toStartOfMinute(ctime)

重新調整物化視圖的寫法,并清理t_1m表中的數據

dba-clickhouse-001 :) show create table t_1m_mv\G statement: CREATE MATERIALIZED VIEW dba_test.t_1m_mv TO dba_test.t_1m ( `ctime` DateTime, `pv` Int64 ) AS SELECT toStartOfTenMinutes(ctime) AS ctime, sum(pv) AS pv FROM dba_test.t_1s GROUP BY ctime dba-clickhouse-001 :) insert into t_1s values('2022-01-01 00:10:01',1),('2022-01-01 00:10:01',1),('2022-01-01 00:20:01',2),('2022-01-01 00:20:01',2),('2022-01-01 00:30:01',3); INSERT INTO t_1s VALUES Query id: 812d1bbd-55f3-4a8f-b9f7-bbbe93e694af Ok. 5 rows in set. Elapsed: 0.003 sec. dba-clickhouse-001 :) select * from t_1m; SELECT * FROM t_1m Query id: 2d1a045a-4e53-4f94-bb6a-fe5e5d58f5c7 ┌───────────────ctime─┬─pv─┐ │ 2022-01-01 00:10:00 │ 2 │ │ 2022-01-01 00:20:00 │ 4 │ │ 2022-01-01 00:30:00 │ 3 │ └─────────────────────┴────┘ 3 rows in set. Elapsed: 0.002 sec.

結論

物化視圖的字段(t_1m_mv)要與目标表(t_1m)的字段名對齊

(表達不是很嚴謹,大概是上面的意思)

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved