在MaxCompute的使用過程中,如果已經積累了大量數據占用了大量存儲資源,且已經通過削減數據存儲生命周期和刪除非必要數據等方式進行了治理,在您的存儲預算有限,計算資源還有冗余的情況下,可以考慮使用數據重排方式對存儲空間進行優化。本文以MaxCompute公共數據集中表為例為您介紹如何通過數據重排方式進行存儲優化。
背景信息
數據重排就是根據數據的特征把具有相同列值字段通過排序放在一塊,以提高壓縮率。MaxCompute中支持以下排序方式對數據進行重排:
ORDER BY:全局排序,將數據全部放到一個Reducer排序,詳情請參見ORDER BY全局排序(order_condition)。
DISTRIBUTE BY:控制Map結果的分發,它會將具有相同字段的Map輸出分發到同一個Reducer上做處理,詳情請參見DISTRIBUTE BY哈希分片(distribute_condition)。
SORT BY:局部排序,其在數據進入Reducer前完成排序,只能保證一個Reducer內的數據是按照指定字段排序,詳情請參見SORT BY局部排序(sort_condition)。
CLUSTER BY : 可以理解為DISTRIBUTE BY和SORT BY某個特定字段,而且只能升序排列。
因為ORDER BY是全局排序,對計算性能的開銷較大,而且集中在單個Reduce上排序并不能起到分布式處理的效果,所以可以通過DISTRIBUTE BY+SORT BY
和CLUSTER BY
兩種方式來進行數據重排。
注意事項
進行數據重排會占用和消耗計算資源,如果您的實例為按量付費規格,將產生計算費用,請您根據實際情況評估是否通過數據重排方式進行存儲優化。
使用
DISTRIBUTE BY+SORT BY
、CLUSTER BY
排序方法進行數據排序前請查看表中數值的分布情況,對列值占比大的列進行重排,存儲優化效果會比較好。表數據越大,進行數據重排后,存儲優化效果會更好。
使用示例
本文將MaxCompute公共數據集TPC-DS中1 TB規格的customer
表分別以DISTRIBUTE BY+SORT BY
、CLUSTER BY
兩種排序方法重排后寫入新的數據表,比較寫入前后表的大小以驗證存儲優化效果,MaxCompute公共數據集TPC-DS詳情請參見TPC-DS數據。步驟如下:
創建數據接收表。
使用如下命令創建數據接收表
storage_test1
和storage_test2
。create table if not exists <storage_test1|storage_test2>( c_customer_sk bigint, c_customer_id char(16), c_current_cdemo_sk bigint, c_current_hdemo_sk bigint, c_current_addr_sk bigint, c_first_shipto_date_sk bigint, c_first_sales_date_sk bigint, c_salutation char(10), c_first_name char(20), c_last_name char(30), c_preferred_cust_flag char(1), c_birth_day bigint, c_birth_month bigint, c_birth_year bigint, c_birth_country varchar(20), c_login char(13), c_email_address char(50), c_last_review_date_sk char(10) );
數據重排。
使用如下命令將TPC-DS公共數據集中
customer
表的數據排序后寫入到數據接收表。說明重排前請查看表中數值的分布情況,對列值占比大的列進行重排效果會比較好(
customer
表中c_email_address
字段列值占比較大)。使用
DISTRIBUTE BY+SORT BY
方式進行數據重排:SET odps.namespace.schema = true; insert overwrite table storage_test1 select * from bigdata_public_dataset.tpcds_1t.customer distribute by c_email_address sort by c_email_address;
使用
CLUSTER BY
方式進行重排:說明使用
CLUSTER BY
方式進行重排后,可能會出現在部分場景下不支持實時插入數據的情況。SET odps.namespace.schema = true; insert overwrite table storage_test2 select * from bigdata_public_dataset.tpcds_1t.customer cluster by c_email_address;
數據重排效果驗證。
使用如下DESC命令,分別查看
bigdata_public_dataset.tpcds_1t.customer
和數據接收表storage_test1
、storage_test2
的表大小,DESC命令詳情請參見DESC TABLE/VIEW。SET odps.namespace.schema = true; desc bigdata_public_dataset.tpcds_1t.customer;
返回表大小為:469939587 bytes。
desc storage_test1;
返回表大小為: 449472614 bytes。
desc storage_test2;
返回表大小為:449565021 bytes。
使用
DISTRIBUTE BY+SORT BY
方式重排數據,存儲優化了約4.355%((469939587-449472614)/469939587*100%
)。使用
CLUSTER BY
方式重排數據,存儲優化了約4.336%((469939587-449565021)/469939587*100%
)。