MaxCompute階層式存放區支援標準儲存、低頻儲存和長期儲存,預設情況下為標準儲存。您可以根據資料的訪問頻率,將某些表或分區的儲存類型設定為低頻儲存或長期儲存,實現資料的冷熱分層,以降低資料存放區費用。
申請開通使用
階層式存放區類型介紹
儲存類型 | 描述 |
標準儲存 | 預設儲存類型,適用於經常訪問資料並對資料進行頻繁讀寫操作的情境。 |
低頻儲存 | 適用於不需要頻繁訪問的資料,能夠有效降低儲存費用。 說明
|
長期儲存 |
階層式存放區計費
儲存類型 | 計費公式 | 價格 | 說明 |
標準儲存 | 日儲存費用=日儲存量平均值×單價 | 專案的實際資料存放區量在1 GB以內(包含1 GB)免費,超過1 GB的部分,計費單價為:0.0006 USD/GB/天。 | 日儲存量平均值=採集到的儲存量之和÷24 |
低頻儲存 |
|
|
|
長期儲存 |
|
|
注意事項
當前低頻儲存和長期儲存類型的資料不支援PAI和Hologres直接存取。
當表或分區設定為低頻儲存或長期儲存時,請注意訪問資料量和頻次,如果訪問資料量大或訪問頻次過多,可能會導致費用高於標準儲存費用。
一個月全量訪問一次低頻儲存的表或分區產生的費用,將等於標準儲存的費用。
六個月全量訪問一次長期儲存的表或分區產生的費用,將等於標準儲存的費用。
設定儲存類型
儲存類型之間可以相互轉換,且修改儲存類型不會影響資料訪問。
儲存類型轉換說明如下:
轉換過程 | 說明 |
標準儲存->低頻儲存 | 支援手動和自動方式轉換,無I/O訪問費,同時不更新表/分區的“資料最後更新時間”和“資料最後訪問時間”。 |
標準儲存->長期儲存 | |
低頻儲存->長期儲存 | 支援手動和自動方式轉換,手動切換有I/O訪問費,自動切換沒有,同時不更新表/分區的“資料最後更新時間”和“資料最後訪問時間”。 |
低頻儲存->標準儲存 | 僅支援手動轉換,有I/O訪問費,同時更新表/分區的“資料最後更新時間”和“資料最後訪問時間”。 |
長期儲存->低頻儲存 | |
長期儲存->標準儲存 |
手動自訂設定
對於非分區表或分區,直接手動自訂設定為低頻儲存或長期儲存類型,設定後立即生效。
命令格式
ALTER TABLE <TABLE_NAME> [PARTITION(<PARTITION_SPEC>)]
SET <TBLPROPERTIES|PARTITIONPROPERTIES>("storagetier"="standard|lowfrequency|longterm");
參數說明
TABLE_NAME:必填,待修改的表或者分區儲存類型的表名稱。
PARTITION_SPEC:當修改分區儲存類型時必填。
TBLPROPERTIES|PARTITIONPROPERTIES:修改表或分區的儲存類型,取值說明:
TBLPROPERTIES:修改表的儲存類型。
PARTITIONPROPERTIES:修改分區的儲存類型。
storagetier:必填,階層式存放區類型,取值說明:
standard:標準儲存,只收取儲存費用。
lowfrequency:低頻儲存,會收取儲存費用和低頻儲存資料訪問費用。
longterm:長期儲存,會收取儲存費用和長期儲存資料訪問費用。
僅支援對分區表中的分區設定階層式存放區,不支援對分區表設定階層式存放區。
使用樣本
樣本1:設定非分區表的儲存類型為低頻儲存。
ALTER TABLE tablename SET TBLPROPERTIES("storagetier"="lowfrequency");
查看錶屬性,可以通過
StorageTier
欄位確認當前的儲存類型。--查看錶屬性 DESC extended tablename; ---返回結果如下 +-------------------------------------------------------------------+ | Owner: ALIYUN$mofan_****@test.aliyunid.com | | Project: mf_mc_**** | | TableComment: | +-------------------------------------------------------------------+ | CreateTime: 2021-11-18 15:14:00 | | LastDDLTime: 2023-09-11 14:34:55 | | LastModifiedTime: 2023-09-13 15:02:28 | | LastAccessTime: 2023-09-14 10:50:57 | +-------------------------------------------------------------------+ | InternalTable: YES | Size: 1923683131 | +-------------------------------------------------------------------+ | Native Columns: | +-------------------------------------------------------------------+ | Field| Type| Label |ExtendedLabel| Nullable| DefaultValue|Comment | +-------------------------------------------------------------------+ | empno | bigint | | | true | NULL | | | ename | string | | | true | NULL | | | job | string | | | true | NULL | | | mgr | bigint | | | true | NULL | | | hiredate | datetime | | | true | NULL | | | sal | bigint | | | true | NULL | | | comm | bigint | | | true | NULL | | | deptno | bigint | | | true | NULL | | +-------------------------------------------------------------------+ | Extended Info: | +-------------------------------------------------------------------+ | TableID: 8e0cc78c81ab4ad7af30bff7a8e**** | | IsArchived: false | | PhysicalSize: 5771049393 | | FileNum: 3 | | StoredAs: AliOrc | | CompressionStrategy: normal | | odps.timemachine.retention.days: 1 | | ColdStorageStatus: N/A | | encryption_enable: false | | StorageTier: lowfrequency | | StorageTierLastModifiedTime: 2023-09-11 14:34:55 | +-------------------------------------------------------------------+
樣本2:設定分區表bank_data_pt相應分區的儲存類型為低頻儲存。
ALTER TABLE bank_data_pt PARTITION (credit='yes') SET PARTITIONPROPERTIES ("storagetier" = 'lowfrequency');
查看分區屬性,可以通過
StorageTier
欄位確認當前的儲存類型。--查看分區屬性 DESC extended bank_data_pt PARTITION(credit='yes'); --返回結果 +------------------------------------------------------------------------------------+ | PartitionSize: 0 | +------------------------------------------------------------------------------------+ | CreateTime: 2024-05-10 10:28:16 | | LastDDLTime: 2024-05-10 10:31:01 | | LastModifiedTime: 2024-05-10 10:28:16 | +------------------------------------------------------------------------------------+ | IsExstore: false | | IsArchived: false | | PhysicalSize: 0 | | FileNum: 0 | | ColdStorageStatus: N/A | | StorageTier: LowFrequency | | StorageTierLastModifiedTime: 2024-05-10 10:31:01 | +------------------------------------------------------------------------------------+
通過生命週期規則自動化佈建
對專案或分區表定義階層式存放區生命週期規則,基於該規則引發階層式存放區類型自動轉換。即:
專案設定後,專案內所有非分區表和分區滿足規則,表和分區會自動轉換為對應的儲存類型。
分區表設定後,該表下所有分區滿足規則,分區會自動轉換為對應的儲存類型。
使用說明
不支援對分區以及非分區表單獨配置階層式存放區生命週期規則。
分區表的階層式存放區生命週期規則優先順序高於專案設定的階層式存放區生命週期規則。
當表或分區的生命週期同時滿足長期儲存(longterm)規則和低頻儲存(lowfrequency)規則時,會被優先轉換為longterm。
當表或分區的生命週期先滿足lowfrequency規則時,會被轉換為lowfrequency,之後再滿足longterm規則時,會再次被轉換為longterm,此時從lowfrequency變成longterm不會產生lowfrequency的訪問費用,計費詳情請參見階層式存放區計費。
平台每天定時進行兩次規則掃描設定,因此可能出現表或分區滿足條件後無法立即進行設定,會存在一定的延遲。
命令格式
專案層級設定生命週期規則
SETPROJECT odps.table.lifecycle.config=<lifecycle_config_json_string>;
除此之外您也可通過MaxCompute控制台進行設定,具體如下:
登入MaxCompute控制台,在左上方選擇地區。
在左側導覽列選擇工作區>專案管理,單擊目標專案操作列的管理。
在參數配置頁簽的生命週期配置地區,配置最近訪問配置策略和最近修改配置策略參數。
最近訪問配置策略:對應
DaysAfterLastAccessGreaterThan
參數。最近修改配置策略:對應
DaysAfterLastModificationGreaterThan
參數。
分區表設定生命週期規則
分區表建表時設定:
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] <table_name> [PRIMARY KEY (<pk_col_name>, <pk_col_name2>),(<col_name> <data_type> [NOT NULL] [DEFAULT <default_value>] [comment <col_comment>], ...)] PARTITIONED BY (<col_name> <data_type> [comment <col_comment>], ...) tblproperties ('lifecycle_config' = '<lifecycle_config_json_string>') ;
分區表修改設定:
ALTER TABLE <TABLE_NAME> SET TBLPROPERTIES ('lifecycle_config' = '<lifecycle_config_json_string>');
查看分區表階層式存放區生命週期的配置
SHOW CREATE TABLE <table_name>;
參數說明
主要參數說明如下,其餘參數資訊請參見通用參數。
lifecycle_config_json_string:
當專案層級設定生命週期規則時,定義如下。
{ "TierToLowFrequency": { "DaysAfterLastModificationGreaterThan": <days>, //距離最後修改時間超過xx天 "DaysAfterLastAccessGreaterThan": <days>, //距離最後訪問時間超過xx天 }, "TierToLongterm": { "DaysAfterLastModificationGreaterThan": <days>, "DaysAfterLastAccessGreaterThan": <days> } //每個條件為可選條件,多個條件為or的關係 }
當分區表設定生命週期規則時,定義如下。
{ \"TierToLowFrequency\": { \"DaysAfterLastModificationGreaterThan\": <days>, //距離最後修改時間超過xx天 \"DaysAfterLastAccessGreaterThan\": <days>, //距離最後訪問時間超過xx天 }, \"TierToLongterm\": { \"DaysAfterLastModificationGreaterThan\": <days>, \"DaysAfterLastAccessGreaterThan\": <days> } //每個條件為可選條件,多個條件為or的關係 }
TierToLowFrequency:低頻儲存標識。
TierToLongterm:長期儲存標識。
DaysAfterLastModificationGreaterThan:定義距離資料最後修改時間超過多少天后自動化佈建,對應表或分區的LastModifiedTime。
DaysAfterLastAccessGreaterThan:定義距離資料最後訪問時間超過多少天后自動化佈建,若表或分區的LastAccessTime為空白,則:
對於2023年10月01日前建立的表或分區,預設按照UTC+0時區的
2023.10.01 00:00:00
時間計算。對於2023年10月01日後建立的表或分區,若資料沒被訪問過,按照CreateTime時間計算。
使用樣本
樣本1:專案層級設定生命週期規則。
setproject odps.table.lifecycle.config={"TierToLongterm":{"DaysAfterLastAccessGreaterThan":180},"TierToLowFrequency":{"DaysAfterLastAccessGreaterThan":120}};
樣本2:取消專案層級生命週期配置。
setproject odps.table.lifecycle.config=;
樣本3:分區表設定生命週期規則。
--分區表建表時設定 CREATE TABLE lifecycle_part_t (key string) PARTITIONED BY (ds STRING) tblproperties ('lifecycle_config' = '{\"TierToLowFrequency\": {\"DaysAfterLastModificationGreaterThan\": 2,\"DaysAfterLastAccessGreaterThan\": 2},\"TierToLongterm\": {\"DaysAfterLastModificationGreaterThan\": 4,\"DaysAfterLastAccessGreaterThan\": 7}}') ; --分區表修改設定 ALTER TABLE lifecycle_part_t SET tblproperties ('lifecycle_config'='{\"TierToLowFrequency\": {\"DaysAfterLastModificationGreaterThan\": 90,\"DaysAfterLastAccessGreaterThan\": 30},\"TierToLongterm\": {\"DaysAfterLastModificationGreaterThan\": 180,\"DaysAfterLastAccessGreaterThan\": 7}}');
樣本4:分區表取消階層式存放區生命週期配置。
ALTER TABLE lifecycle_part_t SET tblproperties ('lifecycle_config'='{}');
階層式存放區資料存取權限設定
對於已經設定為低頻或長期儲存的資料,訪問時會產生訪問費用,基於行級存取控制能力配合GET_PARTITION_META函數可以對低頻或長期儲存資料進行許可權控制,有效控制這些資料的訪問。
GET_PARTITION_META
GET_PARTITION_META是一個很特殊的函數,目前只能配合行級許可權控制來使用,不能在普通的SQL查詢中使用。
文法
struct GET_PARTITION_META(<tableName>, <pt_col1>, <pt_col2>, ..., <pt_col_n>);
參數說明
參數名稱 | 說明 |
tableName | 表名且必須是分區表,String類型。支援 |
pt_col | 從pt_col1至pt_col_n的每個參數,都對應分區表的一個分區層級。而且每個參數都必須是列引用。 |
傳回值說明
返回一個Struct類型,類型為struct<storagetier:string>
。Struct只有一個String類型欄位,描述對應分區的儲存類型。
注意事項
對錶增加行級規則時,需要考慮被控制的使用者之外的其他使用者的訪問行為,如果該表之前已經被其他使用者訪問,則應為這些使用者佈建明確的規則,以避免因未經預期的禁止訪問而導致的資料過濾問題。詳情請參見行級存取控制。
預設情況下,MaxCompute的表不僅可以通過SQL進行訪問,還支援外部引擎(如Spark、Flink)讀取表資料。然而,目前僅MaxCompute SQL引擎支援GET_PARTITION_META函數。因此,如果在行級存取控制中使用了GET_PARTITION_META函數,則該表僅能被MaxCompute SQL引擎讀取,其他引擎將無法正常訪問該表。
在滿足行級許可權的前提下,能夠訪問資料的條件是必須具備資料存取權限控制,即需要擁有該資料的SELECT許可權。
GET_PARTITION_META內的過濾條件,不同的情境會有不同的分區裁剪效果。
過濾條件僅涉及到分區表的分區欄位。例如允許訪問標準儲存並且要求第一級分區的取值是
2024
。GET_PARTITION_META('storage_table', pt1, pt2).storagetier == 'standard') AND pt1='2024'
當使用SQL訪問
storage_table
,WHERE條件沒有分區條件,則系統天然支援分區裁剪,從而避免全表掃描,僅對storage_table
中符合要求的分區進行唯讀訪問。過濾條件中包含非分區欄位的取值,且使用的是與運算(AND)來串連兩個過濾條件。例如允許訪問標準儲存並且和非分區值
a>100
進行與運算(AND)。GET_PARTITION_META('storage_table', pt1, pt2).storagetier == 'standard') AND a > 100
當使用SQL訪問
storage_table
,WHERE條件沒有分區條件,依然支援分區裁剪,只訪問儲存為standard
的分區。過濾條件中包含非分區欄位的取值,且使用或運算(OR)來串連這兩個過濾條件。例如允許訪問標準儲存並且和非分區值
a>100
進行或運算(OR)。get_partition_meta('storage_table', pt1, pt2).storagetier == 'standard') OR a > 100
當使用SQL訪問
storage_table
時,存在兩種情形:WHERE沒有分區條件,則會訪問所有分區以便掃描出滿足
a>100
的資料。WHERE有分區條件則只掃描對應分區內滿足
standard
或a>100
的資料。
使用樣本
定義分區表storage_table
。
CREATE TABLE storage_table(a BIGINT, b BIGINT) PARTITIONED BY (pt1 STRING, pt2 STRING);
樣本一:
為預設使用者授予許可權
policy01
,可以訪問storage_table
標準儲存資料。所有使用者(包括Project Owner)不可訪問低頻或長期儲存資料且返回空值。CREATE ROW ACCESS POLICY policy01 ON storage_table TO DEFAULT FILTER USING (get_partition_meta('storage_table', pt1, pt2).storagetier == 'standard');
樣本二:
授予使用者
user_x
訪問storage_table
中低頻儲存及長期儲存資料的許可權policy02
。CREATE ROW ACCESS POLICY policy02 ON storage_table TO USER (user_x) --也可以通過TO role rolename為角色授權,然後再把角色授權給使用者user。 FILTER USING (get_partition_meta('storage_table', pt1, pt2).storagetier IN ('lowfrequency','longterm'));
存在以下兩種情形:
若專案已設定過
policy01
許可權,所有使用者(除user_x外)可以訪問storage_table
標準儲存資料,不可訪問低頻或長期儲存資料且都返回空值。對於user_x使用者可訪問storage_table
的低頻和長期儲存資料,但不可訪問標準儲存資料會返回空值。若專案未設定過
policy01
許可權,所有使用者(除user_x外)不可訪問storage_table
任何儲存資料且都返回空值。只有user_x使用者可訪問低頻和長期儲存資料,但不可訪問標準儲存資料會返回空值。
樣本三:
授予使用者
user_y
對storage_table
所有資料的存取權限policy03
。CREATE ROW ACCESS POLICY policy03 ON storage_table TO USER (user_y) --也可以通過TO role rolename為角色授權,然後再把角色授權給使用者user。 FILTER USING (true); -- 常量true表示可以訪問對應table的所有資料
存在以下兩種情形:
若專案已設定過
policy01
許可權,所有使用者(除user_y外)可以訪問storage_table
標準儲存資料,不可訪問低頻或長期儲存且都返回空值。對於user_y
使用者可以訪問storage_table
所有儲存類型的資料。若專案未設定過
policy01
許可權,所有使用者(除user_y外)不可訪問storage_table
的任何儲存資料且都返回空值。只有user_y
使用者可訪問storage_table
所有儲存類型資料。