初學大資料maxcompute時部分使用者不是很熟悉maxcompute分區表的概念和使用,那這篇文章來簡單介紹下分區表的概念及使用場景。
實際上,分區在很多架構中都有這個概念,比如開源架構中的hive等。打個比喻,某城市糧倉裡存放麥子,糧倉裡按照縣城分為很多區域,每個縣城都有自己的一塊地方,每個縣城的麥子放在自己對應的區域上。如果上級上司來檢查,想看某縣城的麥子情況,那直接可以根據區域來迅速找到該縣城的麥子。對應到maxcompute分區表,糧倉相當于其中一張表,每個區域相當于以這個縣城命名的分區。
一,分區表的概念
分區表指的是在建立表時指定分區空間,即指定表内的某幾個字段作為分區列。在大多數情況下,使用者可以将分區類比為檔案系統下的目錄。maxcompute 将分區列的每個值作為一個分區(目錄)。使用者可以指定多級分區,即将表的多個字段作為表的分區,分區之間正如多級目錄的關系。在使用資料時如果指定了需要通路的分區名稱,則隻會讀取相應的分區,避免全表掃描,提高處理效率,降低費用。
使用示例:
從其他表插入分區表:
查詢:
這裡查詢的時候可以把分區字段當成普通字段來進行where條件的過濾。那插入後的資料是什麼樣子呢,可以在大資料開發套件中預覽一下表結構

可以看到分區列相當于表中的字段,可以和表中的其他字段一樣來使用。一般是放在where條件後抽取資料使用。
在表中實際的結構是什麼樣呢,其實分區相當于表中的子目錄。那麼如何檢視呢,這裡我使用odps的一個
調試代碼時會下載下傳表結構和小部分資料。sd_data_test的表結構如圖:
想必看到這個圖就很清楚分區列和表字段的關系了。在查詢的時候不會掃描全部表,而是去查某個分區目錄下的資料,可以有效的提高查詢效率。
二,靜态分區,動态分區
靜态分區和動态分區是對應的。所謂靜态分區就是指在插入分區表的時候要指定分區值,比如上面例子
這裡指定的part和year的值,插入之前要指定具體的分區值。動态分區在插入前時候不指定,插入時指定源表的一個字段(多級分區指定多個),那麼在插入的時候相同的字段值會自動建立成一個分區。
下面就介紹下動态分區具體的用法,假設一個場景使用者有一年12個月的中國各個省份的資料資料。那想對這個表的資料進行分區,靜态分區比較繁瑣,可以使用動态分區。
假設 a表是源表非分區表,b表是分區表
三,odps分區的一些注意事項:
目前,在使用動态分區功能的sql中,在分布式環境下,單個程序最多隻能輸出512個動态分區,否則引發運作時異常;
在現階段,任意動态分區sql不允許生成超過2000個動态分區,否則引發運作時異常;
動态生成的分區值不允許為null,也不支援含有特殊字元和中文,否則會引發異常,如:“failed: odps-0123031:partition exception - invalid dynamic partition value: province=xxx”;
如果目标表有多級分區,在運作insert語句時允許指定部分分區為靜态,但是靜态分區必須是進階分區;
還有一點就是如果動态分區,來源表資料量非常大并且分區字段資料分布不均勻容易産生資料傾斜問題,建議先做好規劃,比如先将資料量非常大的那個分區值過濾随後靜态分區單獨插入。
總結:合理設定分區,可以大幅度提高查詢速度降低使用費用,因為maxcompute收費一部分來源于sql計算,設定分區表在計算時指定計算的分區,參與計算的資料不會掃描全表而是指定的部分分區表資料。
另外從計算性能上來說,如果分區資料過多了也會适得其反影響性能,甚至會超出maxcompute的限制。是以合理使用分區表會給計算業務帶來很好的優化效果。
有對大資料技術感興趣的,可以加筆者的微信 wx4085116.目前筆者已經從阿裡離職,部落格不代表阿裡立場。筆者開了一個大資料教育訓練班。有興趣的加我。