MaxCompute分區表和非分區表使用對比
本文我們將通過對有同樣數據量、表結構除分區列其他都一模一樣的表,從查詢計算、寫入、刪除數據幾個簡單操作進行對比,了解MaxCompute分區表和非分區表在使用上有什麼差異。
在介紹之前,需要大家先了解MaxCompute分區的概念。
數據準備
分區表:取公共數據集中的表dwd_prouduct_house_basic_info_out(二手房產數據集);
非分區表:執行建表語句:
create table dwd_prouduct_house_basic_info_out_npt as select * from public_data.dwd_prouduct_house_basic_info_out;
創建表的同時將源表的所有數據都複製到新表dwd_prouduct_house_basic_info_out_npt中。
由於create table … as select …
語句創建的表不會複製分區屬性,隻會把源表的分區列作為目標表的一般列處理,所以新表dwd_prouduct_house_basic_info_out_npt為非分區表。
可以分別執行select count(*) from public_data.dwd_prouduct_house_basic_info_out;
和 select count(*) from dwd_prouduct_house_basic_info_out_npt;
查看這兩個表的記錄數會是一樣。
本次操作表的記錄數為1147676063條。
計算對比
我們執行一個簡單的查詢某個分區數據的job:
Select * from public_data.dwd_prouduct_house_basic_info_out where ds= '20170113';--分區表查詢
Select * from dwd_prouduct_house_basic_info_out_npt where ds= '20170113';--非分區表查詢
計算時長對比
計算資源充足的情況下進行操作。
計算費用對比
我們可以直接通過大數據開發套件->“數據開發”工作區中的“成本估計”對兩條查詢語句進行費用預估,該預估功能采用的計費公式可參考“計量計費->I/O後付費”。
若采用計算預付費模式,可不用在意該計算費用。
下圖是通過成本估計功能預估的費用,結果顯示在非分區表中查詢一樣條件的數據會花費更多,當然最終花費還得看最後的賬單。
table size對比
由於MaxCompute存儲壓縮比不一定完全一致,兩個表數據在MaxCompute的size也會有一定的差異。
desc public_data.dwd_prouduct_house_basic_info_out;
分區表執行結果如下圖:
desc dwd_prouduct_house_basic_info_out_npt; 非分區表執行結果如下圖:
寫入對比
創建三個表,表結構除了分區列,其他都一致:
-
非分區表,
create table house_test_npt(house_id string , house_total_price string , house_unit_price string , house_type string , house_floor string , house_direction string , house_deckoration string , house_area string , house_community_name string , house_region string , house_city string, ds string)
-
以時間為分區的分區表
create table house_test_pt_1(house_id string , house_total_price string , house_unit_price string , house_type string , house_floor string , house_direction string , house_deckoration string , house_area string , house_community_name string , house_region string , house_city string ) partitioned by ( ds string)
-
以時間為一級分區,城市為二級分區的分區表
create table house_test_pt(house_id string , house_total_price string , house_unit_price string , house_type string , house_floor string , house_direction string , house_deckoration string , house_area string , house_community_name string , house_region string ) partitioned by (ds string , house_city string)
分別執行3個insert語句,源表取一模一樣的數據,即select分句一模一樣:
insert overwrite table house_test_npt select house_id,house_total_price,house_unit_price,house_type,house_floor,house_direction,house_deckoration,house_area,house_community_name,house_region,house_city,ds from public_data.dwd_prouduct_house_basic_info_out where ds ='20170114';--寫入非分區表
insert overwrite table house_test_pt_1 partition (ds='20170114') select house_id,house_total_price,house_unit_price,house_type,house_floor,house_direction,house_deckoration,house_area,house_community_name,house_region,house_city from public_data.dwd_prouduct_house_basic_info_out where ds ='20170114';--寫入一級分區表
insert overwrite table house_test_pt partition (ds='20170114',house_city) select house_id,house_total_price,house_unit_price,house_type,house_floor,house_direction,house_deckoration,house_area,house_community_name,house_region,house_city from public_data.dwd_prouduct_house_basic_info_out where ds ='20170114';--使用動態分區方式寫入二級分區表
對比執行過程:
數據刪除操作對比
假設要刪除表某一天的數據,由於MaxCompute不支持delete語法,我們需要通過別的方式進行數據刪除。
-
分區表隻需要通過alter語句drop對應分區即可,如下刪除分區為20170112的數據:
ALTER TABLE public_data.ods_enterprise_share_basic DROP IF EXISTS PARTITION (ds='20170112');
-
非分區表,需要將不需要刪除的數據查詢出來並覆蓋寫入方式寫回表中,增加了計算量。
INSERT OVERWRITE TABLE dwd_prouduct_house_basic_info_out_npt SELECT * FROM dwd_prouduct_house_basic_info_out_npt WHERE ds<>'20170112';
最後更新:2017-07-05 16:02:25