Doris臨時分區


臨時分區

臨時分區是歸屬於某一分區表的。只有分區表可以創建臨時分區。這塊很核心只有分區表才會有臨時分區。

規則:
臨時分區的分區字段和正式分區一樣
臨時分區的名稱必須不一樣並且和正式分區也不一樣
臨時分區支持添加、刪除、替換操作
臨時分區的添加和正式分區的添加操作相似。臨時分區的分區范圍獨立於正式分區。

添加臨時分區
ALTER TABLE expamle_range_tbl ADD TEMPORARY PARTITION tp2 VALUES LESS THAN("2020-02-01");
ALTER TABLE tbl2 ADD TEMPORARY PARTITION tp1 VALUES [("2020-01-01"), ("2020-02-01"));
ALTER TABLE tbl1 ADD TEMPORARY PARTITION tp1 VALUES LESS THAN("2020-02-01")
("in_memory" = "true", "replication_num" = "1")
DISTRIBUTED BY HASH(k1) BUCKETS 5;

刪除臨時分區
刪除臨時分區,不影響正式分區的數據

ALTER TABLE expamle_range_tbl DROP TEMPORARY PARTITION tp1;

插入臨時分區測試數據;
此處注意插入時若不指定臨時分區,則默認插入正式分區,若數據不在正式分區范圍內,則會報錯;如下就是正常插入時數據不落入任何分區時會報錯。

以下插入指定臨時分區時,所對應的數據必須能放入臨時分區的范圍,否則會報無法匹配的錯誤 如下: Reason: no partition for this tuple. tuple=(11111 2022-04-01 2000-11-11 11:11:11 bj 111 1 2022-01-01 00:00:00 1000 11 22). src line: [];

INSERT INTO expamle_range_tbl TEMPORARY PARTITION(tp2) values(11111,'2018-04-01','2000-11-11 11:11:11','bj',111,1,'2022-01-01 00:00:00',1000,11,22);


INSERT INTO expamle_range_tbl TEMPORARY PARTITION(tp2) values(11111,'2022-04-01','2000-11-11 11:11:11','bj',111,1,'2022-01-01 00:00:00',1000,11,22);

查詢臨時分區數據

SELECT ... FROM
tbl1 TEMPORARY PARTITION(tp1, tp2, ...)
JOIN
tbl2 TEMPORARY PARTITION(tp1, tp2, ...)
ON ...
WHERE ...;

select * from expamle_range_tbl TEMPORARY PARTITION(tp2);

如上查詢則就查詢到插入臨時分區的數據

替換分區

可以通過 ALTER TABLE REPLACE PARTITION 語句將一個表的正式分區替換為臨時分區。
strict_range :
默認為 true。當該參數為 true 時,表示要被替換的所有正式分區的范圍並集需要和替換的臨時分區的范圍並集完全相同。當置為 false 時,只需要保證替換后,新的正式分區間的范圍不重疊即可。
具體使用見官網例子:

use_temp_partition_name:
默認為 false。當該參數為 false,並且待替換的分區和替換分區的個數相同時,則替換后的正式分區名稱維持不變。如果為 true,則替換后,正式分區的名稱為替換分區的名稱。
分區替換成功后,被替換的分區將被刪除且不可恢復 : 也就是被替換的分區將被刪除掉不可以恢復

--  以下這個語句的作用是使用 tp1 分區替換 p1 分區
ALTER TABLE tbl1 REPLACE PARTITION (p1) WITH TEMPORARY PARTITION (tp1);

ALTER TABLE tbl1 REPLACE PARTITION (p1, p2) WITH TEMPORARY PARTITION (tp1, tp2, tp3);

ALTER TABLE tbl1 REPLACE PARTITION (p1, p2) WITH TEMPORARY PARTITION (tp1, tp2)
PROPERTIES (
    "strict_range" = "false",
    "use_temp_partition_name" = "true"
);

實操:

-- 創建表
CREATE TABLE `expamle_range_tbl` (
  `user_id` largeint(40) NOT NULL COMMENT "用戶id",
  `date` date NOT NULL COMMENT "數據灌入日期時間",
  `timestamp` datetime NOT NULL COMMENT "數據灌入的時間戳",
  `city` varchar(20) NULL COMMENT "用戶所在城市",
  `age` smallint(6) NULL COMMENT "用戶年齡",
  `sex` tinyint(4) NULL COMMENT "用戶性別",
  `last_visit_date` datetime REPLACE NULL DEFAULT "1970-01-01 00:00:00" COMMENT "用戶最后一次訪問時間",
  `cost` bigint(20) SUM NULL DEFAULT "0" COMMENT "用戶總消費",
  `max_dwell_time` int(11) MAX NULL DEFAULT "0" COMMENT "用戶最大停留時間",
  `min_dwell_time` int(11) MIN NULL DEFAULT "99999" COMMENT "用戶最小停留時間"
) ENGINE=OLAP
AGGREGATE KEY(`user_id`, `date`, `timestamp`, `city`, `age`, `sex`)
COMMENT "OLAP"
PARTITION BY RANGE(`date`)
(PARTITION p201701 VALUES [('0000-01-01'), ('2017-02-01')),
PARTITION p201702 VALUES [('2017-02-01'), ('2017-03-01')),
PARTITION p201703 VALUES [('2017-03-01'), ('2017-04-01')))
DISTRIBUTED BY HASH(`user_id`) BUCKETS 16
PROPERTIES (
"replication_num" = "1",
"in_memory" = "false",
"storage_format" = "V2"
);
-- 插入測試數據
insert into expamle_range_tbl  values(11111,'2017-01-01','2000-11-11 11:11:11','bj',111,1,'2022-01-01 00:00:00',1000,11,22);
insert into expamle_range_tbl  values(11112,'2017-02-22','2000-11-11 11:11:11','bj',111,1,'2022-01-01 00:00:00',1000,11,22);
insert into expamle_range_tbl  values(11113,'2017-03-22','2000-11-11 11:11:11','bj',111,1,'2022-01-01 00:00:00',1000,11,22);
-- 查詢正式分區驗證 
select * from expamle_range_tbl PARTITION(p201701,p201702,p201703);

驗證分區插入結果

-- 創建臨時分區
ALTER TABLE expamle_range_tbl ADD TEMPORARY PARTITION tp1 VALUES LESS THAN("2017-02-01");
-- 插入數據到臨時分區
INSERT INTO expamle_range_tbl TEMPORARY PARTITION(tp1) values(11115,'2017-01-01','2017-01-01 11:11:11','sh',111,1,'2022-11-11 00:00:00',100,11,22);
-- 從臨時分區查詢數據驗證
select * from expamle_range_tbl TEMPORARY PARTITION(tp1);
select * from expamle_range_tbl  PARTITION(tp1);

-- replace分區  use_temp_partition_name  的作用就是 若為 true  則分區 p201701 會刪除掉,只能使用 修正過的正式分區   tp1 查詢
-- 若為false  則原正式分區 p201701  還會保留只是下面的數據替換為 臨時分區  tp1 下面的了,可以繼續使用 正式分區查詢
ALTER TABLE expamle_range_tbl REPLACE PARTITION (p201701) WITH TEMPORARY PARTITION (tp1)
PROPERTIES (
    "strict_range" = "true",
    "use_temp_partition_name" = "true"
);
-- 最終效果就是  p201701 分區將被刪除掉,包括分區信息和分區下面的數據; 臨時分區也將不存在,使用 tp1 名稱 作為正式分區

select * from expamle_range_tbl PARTITION(p201701);

select * from expamle_range_tbl PARTITION(p201702,p201703);

select * from expamle_range_tbl PARTITION(tp1); 如下結果可以發現 就是之前的臨時分區 tp1 的數據

select * from expamle_range_tbl; 以下可以發現臨時分區的數據對於正式分區不可見。

ALTER TABLE expamle_range_tbl DROP TEMPORARY PARTITION tp1;
ALTER TABLE expamle_range_tbl DROP PARTITION tp1;
坑窪區:
若 strict_range 為true模式,並且他們分區范圍並集不一樣則會出現下述錯誤:

strict_range 為 false了, 但是需要保證分區范圍不重疊,則會報下述錯誤。 意思是最左邊界 和 最右邊界 必須一樣,否則也不行

臨時分區的導入和查詢

導入臨時分區

INSERT INTO tbl TEMPORARY PARTITION(tp1, tp2, ...) SELECT ....
curl --location-trusted -u root: -H "label:123" -H "temporary_partitions: tp1, tp2, ..." -T testData http://host:port/api/testDb/testTbl/_stream_load

LOAD LABEL example_db.label1
(
DATA INFILE("hdfs://hdfs_host:hdfs_port/user/palo/data/input/file")
INTO TABLE my_table
TEMPORARY PARTITION (tp1, tp2, ...)
...
)
WITH BROKER hdfs ("username"="hdfs_user", "password"="hdfs_password");

CREATE ROUTINE LOAD example_db.test1 ON example_tbl
COLUMNS(k1, k2, k3, v1, v2, v3 = k1 * 100),
TEMPORARY PARTITIONS(tp1, tp2, ...),
WHERE k1 > 100
PROPERTIES
(...)
FROM KAFKA
(...);

和其他操作的關系

DROP
使用 Drop 操作直接刪除數據庫或表后,可以通過 Recover 命令恢復數據庫或表(限定時間內),但臨時分區不會被恢復。
使用 Alter 命令刪除正式分區后,可以通過 Recover 命令恢復分區(限定時間內)。操作正式分區和臨時分區無關。
使用 Alter 命令刪除臨時分區后,無法通過 Recover 命令恢復臨時分區。

TRUNCATE
使用 Truncate 命令清空表,表的臨時分區會被刪除,且不可恢復。
使用 Truncate 命令清空正式分區時,不影響臨時分區。
不可使用 Truncate 命令清空臨時分區。

ALTER
當表存在臨時分區時,無法使用 Alter 命令對表進行 Schema Change、Rollup 等變更操作。
當表在進行變更操作時,無法對表添加臨時分區。

最佳實踐

  1. 原子的覆蓋寫操作
    Doris不支持覆蓋寫,只能先刪除后插入,但是這樣會導致一段時間的不可讀,因此可以先寫入臨時分區,然后搞一個分區替換就行了
  2. 修改分桶數
    原始表分桶數設置不合理, 可以設置一個和原分區分區范圍一致的虛擬分區,然后使用 insert into select 把原始分區的數據寫入虛擬分區,再來個分區替換就達到修改分區的效果
  3. 合並或分割分區
    分區range 設置的不合理,用戶想縮小或者擴大分區,那么就可以設置對應的虛擬分區,然后使用 insert into select 把原始分區的數據寫入虛擬分區,再來個分區替換就達到分區擴縮容的效果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM