07_clickhouse、自定义分区及底层存储合并机制、自定义分区键、分区目录的命名规则、分区目录的合并过程、分区目录的合并过程、分区表达式指定、分区案例
4.自定義分區及底層存儲合并機制
4.1.自定義分區鍵
4.2.分區目錄的命名規則
4.3.分區目錄的合并過程
4.4.分區目錄的合并過程
4.5.分區表達式指定
4.6.分區案例
4.自定義分區及底層存儲合并機制
4.1.自定義分區鍵
1.分區是在建表時使用PARTITION BY expr子句指定。
2.分區鍵可以是表列中的任何表達式。
例如,按月指定分區:PARTITION BY toYYYYMM(date_column)。
使用元組指定分區:PARTITION BY (toMonday(StartDate),EventType)
3.在將新數據插入表中時,每個分區的數據存儲為單獨的數據片段(每個數據片段的數 據是按主鍵排序的),在插入后的10-15分鐘內,同一個分區的數據片段將合并為一個整 體的數據片段。
4.2.分區目錄的命名規則
根據分區表達式的數據類型,分區的命名規則是存在差異的。
1.不指定分區:分區名稱為all
2.數值數據類型:分區名稱為數值。
3.日期數據類型:將日期轉換為數字作為分區名稱。
4.字符串數據類型:將日期轉換為hash作為分區名稱。
系統表:
xxxxx :) SELECT partition,name,table,active FROM system.parts WHERE table like '%demo%';SELECT partition,name,table,active FROM system.parts WHERE table LIKE '%demo%'┌─partition─┬─name─────────┬─table─────────────┬─active─┐ │ 201403 │ 201403_1_1_0 │ TabSeparated_demo │ 1 │ └───────────┴──────────────┴───────────────────┴────────┘1 rows in set. Elapsed: 0.009 sec. xxxxx :)4.3.分區目錄的合并過程
在將新數據插入表中時,每個分區的數據按照目錄存儲為單獨的數據片段,目錄名為數據片段名稱,這個和System.parts表的name字段一致。
在插入后的10-15分鐘內,同一個分區的數據片段將合并為一個整體的數據片段。
數據片段名稱包含了4部分的信息,下面以數據片段20200421_1_2_1為例進行拆解:
- 20200421是分區名稱。
- 1是數據塊的最小編號。
- 2 是數據塊的最大編號。
- 1 是塊級別,即該塊在MergeTree中的深度。
4.4.分區目錄的合并過程
1.active列為數據片段的狀態。1表示激活狀態,0表示非激活狀態。當源數據片段合并為較大的片段之后,這些源的數據片段就變為了非激活狀態。損壞的數據片段也是非激活狀態。
2.同一分區有多個獨立的數據片段,這表明這些片段尚未合并。
ClickHouse會在插入后大約15分鐘后合并數據片段,也可以使用OPTIMIZE語句執行計劃外的合并:
OPTIMIZE TABLE mergeTableDemo PARTITION 202004;
3.非激活的片段(active=0片段)將在合并后約10分鐘被刪除。
4.detached目錄包含使用DETACHED語句從表分離的數據片段。損壞的數據片段也將移至該目錄,而不是被刪除。ClickHouse不會使用detached目錄中的數據片段。此目錄中的數據可以隨時添加、刪除或修改,ClickHouse只能在運行ATTACH語句時才會感知該目錄。
4.5.分區表達式指定
alter語句、optimize語句通常需要指定分區的表達式,分區表達式的值為system.parts的partition字段, 而不是分區的名稱,這里需要注意。
因為字符串和日期類型的分區,分區名稱和分區表達式的值是不一樣的。
例如:日期類型的分區:
分區表達式的值是2020-04-21,分區名稱為20200421。
上面的值可以通過類似如下的方式查詢到:
select p.`partition` as `partition`,p.name as name,p.`table` as `table`,p.active as active from `system`.parts p where p.`table` = 'test_partition_date'執行optimize操作:
optimize table test_partition partition '2020-04-21'。不能寫成:
optimize table test_partition partition '20200421。4.6.分區案例
1.不指定分區
drop table test_partition_non; create table test_partition_non(name String, timestamp DateTime) ENGINE=MergeTree() order by name; insert into test_partition_non values ('nanjing', '2020-04-21 12:23:33');2.分區是數值
drop table test_partition_numeric; create table test_partition_numeric(id UInt64, timestamp DateTime) ENGINE=MergeTree() order by id partition by id; insert into test_partition_numeric values (556, '2020-04-21 12:23:33');3.分區是日期
drop table test_partition_date; create table test_partition_date(date Date, timestamp DateTime) ENGINE=MergeTree() order by date partition by date; insert into test_partition_date values ('2020-04-21', '2020-04-21 12:23:33');4.分區是字符串
drop table test_partition_string; create table test_partition_string(name String, timestamp DateTime) ENGINE=MergeTree() order by name partition by name; insert into test_partition_string values ('hangzhou', '2020-04-21 12:23:33');查看分區信息,可以通過如下方式:
SELECT partition,name,table,active FROM system.parts WHERE table like ‘test_partition_%’; xxxxx :) SELECT partition, name, table, active FROM system.parts WHERE table like 'test_partition_%';SELECT partition,name,table,active FROM system.parts WHERE table LIKE 'test_partition_%'┌─partition─┬─name──────┬─table──────────────────┬─active─┐ │ tuple() │ all_1_1_0 │ test_partition_date │ 1 │ │ tuple() │ all_1_1_0 │ test_partition_non │ 1 │ │ 556 │ 556_1_1_0 │ test_partition_numeric │ 1 │ └───────────┴───────────┴────────────────────────┴────────┘3 rows in set. Elapsed: 0.010 sec. xxxxx :)總結
以上是生活随笔為你收集整理的07_clickhouse、自定义分区及底层存储合并机制、自定义分区键、分区目录的命名规则、分区目录的合并过程、分区目录的合并过程、分区表达式指定、分区案例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 职高毕业一年后去参军,参军两年退役后还可
- 下一篇: 中国航空运动协会飞行员执照怎么年检?