MaxCompute表的小文件會影響存儲和計算性能,所以咱們先介紹下什麼樣的操做會產生大量小文件,從 而在作表設計的時候考慮避開此類操做。數據庫
項目空間(Project)是MaxCompute最高層的對象,按項目空間進行資源的分配、隔離和管理,實現了 多租戶的管理能力。session
通常狀況下描述屬性的表設計爲維度表。維度表能夠和任意表組的任意表進行關聯,而且建立時不須要配 置分區信息,可是對單表數據量大小有所限制。維度表的設計和使用注意如下幾點:工具
極限存儲功能待發布,在此介紹主要提供設計思想。 基於MaxCompute的拉鍊表設計背景 在數據倉庫的數據模型設計過程當中,常常會遇到這樣的需求:性能
create table src_tbl (key0 STRING, key1 STRING, col0 STRING, col1 STRING, col2 STRING) PARTITIO N (datestam p_x STRING, pt0 STRING);
set odps.exstore.primarykey=key0,key1; [set odps.exstore.ignorekey=col0;] EXSTO RE exstore_tbl PARTITIO N (datestam p_x='20140801'); EXSTO RE exstore_tbl PARTITIO N (datestam p_x='20140802');
拉鍊表設計更詳細介紹能夠參考雲棲文章:https://yq.aliyun.com/articles/542146#? spm=a2c41.11181499.0.0開發工具
數據採集方式:流式數據寫入, 批量數據寫入,週期調度條式數據插入。
大數據量狀況下,確保同一個業務單元的數據使用分區和表進行分;在數據量較小狀況下,優化採集頻率。大數據
流式數據寫入。優化
日誌實際上是個流水錶,不涉及記錄的更新,來一條採集一條,多條一塊兒存放,日誌表設計的主要注意幾 點:阿里雲
create table src_tbl (key0 STRING, key1 STRING, col0 STRING, col1 STRING, col2 STRING) PARTITIO N (datestam p_x STRING, pt0 STRING); set odps.exstore.primarykey=key0,key1; [set odps.exstore.ignorekey=col0;] EXSTO RE exstore_tbl PARTITIO N (datestam p_x='20140801'); EXSTO RE exstore_tbl PARTITIO N (datestam p_x='20140802');
考慮是否須要擴展維度屬性。spa
考慮區分終端類型。命令行
注意:
週期快照表,天天對收藏的全部記錄進行快照存放。
問題:歷史累計的記錄很是多,天天生成快照要拿當天增量表與前一天的全量表merge,很是耗資源。統 計最近1天的新增收藏數,須要掃描全量表,如何下降資源?
建議的方案:創建一個事務性事實表,在創建一個存放當前有效收藏的週期快照表,以知足各類不一樣業務 的統計分析須要。
注意:
關係型數據庫支持的 delete/update/merge SQL ,在MaxCompute上的實現方式示例以下:
表準備
-- 上日全量表 table1(key1 string,key2 string,col1 string,col2 string); -- 今日增量表 table2(key1 string,key2 string,col1 string,col2 string); -- 今日增量表(刪除) table3(key1 string,key2 string,col1 string,col2 string);
update(table2 表中的記錄的值,更新到table1表中)
insert overwrite table table1 select t1.key1 ,t1.key2 ,case when t2.key1 is not null then t2.col1 else t1.col1 end as col1 ,case when t2.key1 is not null then t2.col2 else t1.col2 end as col2 from table1 t1 left outer join table2 t2 on t1.key1=t2.key1 and t1.key2 = t2.key2 ;
delete(table2 表中的記錄,從table1表中刪除)
insert overwrite table table1 select t1.key1 ,t1.key2 ,t1.col1 ,t1.col2 from table1 t1 left outer join table2 t2 on t1.key1=t2.key1 and t1.key2 = t2.key2 where t2.key1 is null ;
merge(沒有del)
insert overwrite table table1 select from ( -- 先把上日存在,今日也存在的記錄從上日表中排除。剩下的就是今日沒有更新的記錄 select t1.key1 ,t1.key2 ,t1.col1 ,t1.col2 from table1 t1 left outer join table2 t2 on t1.key1=t2.key1 and t1.key2 = t2.key2 where t2.key1 is null union all -- 再合併上今日增量,就是今天的全量 select t2.key1 select t2.key1 ,t2.key2 ,t2.col1 ,t2.col2 from table2 t2)tt ;
merge(有del)
insert overwrite table table1 select
from (
-- 先把上日存在,今日也存在的記錄從上日表中排除,再把今日刪除的記錄排除。剩下的就是今日沒有更 新的記錄
insert overwrite table table1 select from ( -- 先把上日存在,今日也存在的記錄從上日表中排除,再把今日刪除的記錄排除。剩下的就是今日沒有更 新的記錄 select t1.key1 ,t1.key2 ,t1.col1 ,t1.col2 from table1 t1 left outer join table2 t2 on t1.key1=t2.key1 and t1.key2 = t2.key2 left outer join table3 t3 on t1.key1=t3.key1 and t1.key2 = t3.key2 where t2.key1 is null or t2.key1 is null union all -- 再合併上今日增量,就是今天的全量 select t2.key1 ,t2.key2 ,t2.col1 ,t2.col2 from table2 t2)tt ;
場景:天氣狀況信息採集。
MaxCompute表/分區提供數據生命週期管理。表(分區)數據從最後一次更新時間算起,在通過指定的 時間後沒有變更,則此表(分區)將被MaxCompute自動回收。這個指定的時間就是生命週期,生命週期 設置爲表級別。
create table test_lifecycle(key string) lifecycle 100;/alter table test_l ifecycle set lifecycle 50;
MaxCompute會根據每張非分區表或者分區的的LastDataModifiedTime以及lifecycle的設置來判斷是 否要回收此非分區表或者分區表中的分區。 MaxCompute SQL提供touch操做用來修改分區的 LastDataModifiedTime。會將分區的LastDataModifiedTime修改成當前時間。修改 LastDataModifiedTime的值,MaxCompute會認爲表或分區的數據有變更,生命週期的計算會從新開始。
ALTER TABLE table_nam e TO UCH PARTITIO N(partition_col='partition_col_valu e', ...);
注意:
表設計:
Tunnel數據採集過程當中產生的小文件建議:
使用臨時表建議建立時都加上生命週期,到期後垃圾回收自動回收。 - 申請過多的datahub shard將會產生小文件問題,申請datahub shard數目的策略 :
Hash Clustering表的優點:優化Bucket Pruning/優化Aggregation/優化存儲。 在建立表時使用CLUSTERED BY指定Hash Key,MaxCompute將對指定列進行Hash運算,按照Hash 值分散到各個Bucket裏面。
Hash Key指選擇原則:
ALTER TABLE table_nam e [CLUSTERED BY (col_nam e [, col_nam e, ...]) [SO RTED B Y (col_nam e [ASC | DESC] [, col_nam e [ASC | DESC] ...])] INTO num ber_of_buck ets BUCKETS]
ALTER TABLE語句適用於存量表,在增長了新的彙集屬性以後,新的分區將作hash cluster存儲。 建立 完HashClustering的表以後使用insert overwrite從另一個源表進行轉化。
注意,Hash Clustering表有如下限制: