tft每日頭條

 > 圖文

 > 數倉中的數據清洗在哪一層

數倉中的數據清洗在哪一層

圖文 更新时间:2024-12-02 14:35:10

摘要:本文從分區自動管理的作用、用法、原理等方面進行介紹。

本文分享自華為雲社區《GaussDB(DWS) 分區自動管理介紹-雲社區-華為雲》,作者: Attila。

對于分區列為時間的分區表,分區自動管理功能可以自動創建新分區和删除過期分區,降低分區表的維護成本,改善查詢性能。下面将從分區自動管理的作用、用法、原理等方面進行介紹。

1. 分區自動管理作用

為了便于查詢和維護數據,客戶通常使用分區列為時間的分區表來存儲時間相關的數據,例如電商的訂單信息、 物聯網采集的實時數據。這些時間相關的數據導入分區表時,需要保證分區表要有對應時間的分區,由于普通的分區表不會自動創建新的分區和删除過期分區,所以維護人員需要定期創建新分區和删除過期分區,提高了運維成本。

為解決上述問題,GaussDB(DWS) 引入了分區自動管理特性。使用者可通過設置表級參數PERIOD、ttl開啟分區自動管理功能,使分區表可以自動創建新分區和删除過期分區,降低分區表的維護成本,改善查詢性能。其中,period既表示新分區的時間範圍,也表示自動創建新分區和自動删除過期分區的周期;ttl表示分區過期時間。period和ttl的值均為Interval類型,例如’1 hour’、‘1 day’、‘1 week’、‘1 month’、‘1 year’、 '1 month 2 days 3 hours’等。

1.1 自動創建新分區

分區自動管理每隔period的時間就會自動創建分區,每次創建一個或多個時間範圍為period的新分區,以推進最大的分區邊界時間,保證其大于nowTime 30*period。由于每次創建分區時,都動态地為未來時間創建了預留分區,所以隻要有一次自動創建新分區成功,就可以保證在未來30個period的時間之内,都不會出現實時數據因為沒有對應分區而導入失敗的情況。

數倉中的數據清洗在哪一層(帶你認識一下數倉的分區自動管理)1

1.2 自動删除過期分區

邊界時間早于nowTime-ttl的分區被認為是過期分區。分區自動管理每隔period的時間就會遍曆檢測所有分區,并删除其中的過期分區,如果所有的分區都是過期分區,則保留一個分區,并truncate該表。

2. 分區自動管理用法2.1 分區管理功能約束

在使用分區管理功能時,需要滿足如下約束:

1)不支持在小型機、加速集群、單機集群上使用。

2)不支持在8.1.3版本以下的版本中使用。

3)僅支持行存範圍分區表、列存範圍分區表、時序表以及冷熱表。

4)分區鍵唯一并且類型僅支持timestamp、timestamptz、date類型。

5)不支持存在maxvalue分區。

6)(nowTime - boundaryTime) / period需要小于分區個數上限,其中nowTime為當前時間,boundaryTime為現有分區中最早的分區邊界時間。

7)period、ttl取值範圍為1 hour ~ 100 years。另外,在兼容Teradata或MySQL的數據庫中,分區鍵類型為date時,period不能小于1 day。

8)表級參數ttl不支持單獨存在,必須要提前或同時設置period,并且要大于或等于period。

9)集群在線擴容期間,自動增加分區會失敗,但是由于每次增分區時,都預留了足夠的分區,所以不影響使用。

2.2 開啟分區管理功能

分區管理功能是和表級參數period、ttl綁定的,隻要成功設置了表級參數period,即開啟了自動創建新分區功能;成功設置了表級參數ttl,即開啟了自動删除過期分區功能。第一次自動創建分區或删除分區的時間為設置period或ttl後30秒。

有兩種開啟分區管理功能的方式,具體如下:

1)建表時指定period、ttl

該方式适用于新建分區管理表時使用。新建分區管理表有兩種語法,一種是建表時指定分區,另一種是建表時不指定分區。

建分區管理表時如果指定分區,則語法規則和建普通分區表相同,唯一的區别就是會指定表級參數period、ttl,具體示例如下。在該示例中,分區過期時間為7 days,新分區的時間範圍以及自動分區任務周期為1 day。

CREATE TABLE CPU1( id integer, IP text, time timestamp ) with (TTL='7 days',PERIOD='1 day') partition by range(time) ( PARTITION P1 VALUES LESS THAN('2022-01-05 16:32:45'), PARTITION P2 VALUES LESS THAN('2022-01-06 16:56:12') );

建分區管理表時可以隻指定分區鍵不指定分區,此時将創建兩個默認分區,這兩個默認分區的分區時間範圍均為period。其中,第一個默認分區的邊界時間是大于當前時間的第一個整時/整天/整周/整月/整年的時間,具體選擇哪種整點時間取決于period的最大單位;第二個默認分區的邊界時間是第一個分區邊界時間加period。假設當前時間是2022-02-17 16:32:45,各種情況的第一個默認分區的分區邊界選擇如下表:

數倉中的數據清洗在哪一層(帶你認識一下數倉的分區自動管理)2

建表時不指定分區的具體示例如下:

CREATE TABLE CPU2( id integer, IP text, time timestamp ) with (TTL='7 days',PERIOD='1 day') partition by range(time);

2)使用alter table set的方式設置period、ttl

該方式适用于給一張滿足分區管理約束的普通分區表增加分區管理功能。

假設cpu3表是一張滿足分區管理約束的普通分區表,給該表增加分區管理功能的示例如下:

-- 同時開啟自動創建和自動删除分區功能 ALTER TABLE cpu3 SET (PERIOD='1 day',TTL='7 days'); -- 隻開啟自動創建分區功能 ALTER TABLE cpu3 SET (PERIOD='1 day'); -- 隻開啟自動删除分區功能,如果沒有提前開啟自動創建分區功能,則開啟失敗 alter TABLE cpu3 SET (TTL='7 days');

2.3 修改分區管理功能

修改分區管理功能主要是修改period和ttl,可以通過alter table set的方式修改。

假設cpu4表是一張分區管理表,修改其period和ttl示例如下:

-- 同時修改period ALTER TABLE cpu4 SET (TTL='10 days',PERIOD='2 days');

2.4 關閉分區管理功能

使用alter table reset的方式可以删除表級參數period、ttl,進而關閉相應的分區管理功能。需要注意的是,不能在存在ttl的情況下,單獨删除period。另外,時序表不支持alter table reset。

假設cpu5表是一張具有period和ttl的分區管理表,關閉其分區管理功能示例如下:

-- 同時關閉自動創建和自動删除分區功能 ALTER TABLE cpu5 RESET (PERIOD,TTL); -- 隻關閉自動删除分區功能 ALTER TABLE cpu5 RESET (TTL); -- 隻關閉自動創建分區功能,如果該表有ttl參數,則關閉失敗 ALTER TABLE cpu5 RESET (PERIOD);

3.分區自動管理原理3.1 基本原理

分區管理的實現依托了pg_task自動調度任務,即設置period/ttl時,向scheduler.pg_task表中插入了自增/自減分區管理任務,其中自增分區任務的任務内容為proc_add_partition(relname, period)函數,自減分區任務為proc_drop_partition(relname, ttl)函數,兩種任務的調用周期均為period,第一次執行時間為任務插入時間後30秒。

使用管理員權限,可以查看scheduler.pg_task表中任務具體的信息,例如任務内容(what字段)、任務執行周期(interval字段)、任務上一次成功執行的時間(actual_end_time字段)、任務狀态(task_status字段)。當自動調度任務執行失敗時,用戶可以複制scheduler.pg_task表中分區管理任務的what字段,然後手動執行該任務。查看scheduler.pg_task表以及手動執行自增分區任務示例如下:

my_database=# SELECT what,interval FROM scheduler.pg_task; what | interval -------------------------------------------------------------- ---------- call proc_add_partition('public.cpu1', interval '1 day'); | 1 day call proc_drop_partition('public.cpu1', interval '7 days'); | 1 day (2 rows) my_database=# call proc_add_partition('public.cpu1', interval '1 day'); proc_add_partition -------------------- (1 row)

3.2 proc_add_partition(relname regclass, boundaries_interval interval)

該函數用于自動添加分區,具體實現流程如下圖。函數運行時,會在分區表現有分區邊界的基礎上,創建多個時間範圍為boundaries_interval的新分區,直到新的boundary距離當前時間大于29個boundaries_interval,之後再額外多創建一個分區,保證該函數運行時,一定會創建一個新分區 。

數倉中的數據清洗在哪一層(帶你認識一下數倉的分區自動管理)3

3.3 proc_drop_partition (relname regclass, older_than interval)

該函數用于自動删除過期分區。函數運行時,會遍曆分區表所有分區,并删除其中boundary早于(now_time - older_than)的分區;如果所有分區都滿足删除條件,則保留一個分區,并truncate該表。

點擊下方,第一時間了解華為雲新鮮技術~

華為雲博客_大數據博客_AI博客_雲計算博客_開發者中心-華為雲

,

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

查看全部

相关圖文资讯推荐

热门圖文资讯推荐

网友关注

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