閱讀667 返回首頁    go 阿裏雲 go 技術社區[雲棲]


阿裏雲大數據利器Maxcompute學習之--分區表的使用

初學大數據Maxcompute時部分用戶不是很熟悉Maxcompute分區表的概念和使用,那這篇文章來簡單介紹下分區表的概念及使用場景。
  實際上,分區在很多框架中都有這個概念,比如開源框架中的hive等。打個比喻,某城市糧倉裏存放麥子,糧倉裏按照縣城分為很多區域,每個縣城都有自己的一塊地方,每個縣城的麥子放在自己對應的區域上。如果上級領導來檢查,想看某縣城的麥子情況,那直接可以根據區域來迅速找到該縣城的麥子。對應到Maxcompute分區表,糧倉相當於其中一張表,每個區域相當於以這個縣城命名的分區。

一,分區表的概念
分區表指的是在創建表時指定分區空間,即指定表內的某幾個字段作為分區列。在大多數情況下,用戶可以將分區類比為文件係統下的目錄。MaxCompute 將分區列的每個值作為一個分區(目錄)。用戶可以指定多級分區,即將表的多個字段作為表的分區,分區之間正如多級目錄的關係。在使用數據時如果指定了需要訪問的分區名稱,則隻會讀取相應的分區,避免全表掃描,提高處理效率,降低費用。
使用示例:

建表: CREATE TABLE sd_data_test (
 userid STRING,
 shopid STRING,
 dtime DATETIME
)
PARTITIONED BY (
 part STRING,
 year STRING
)
LIFECYCLE 100000;

 
從其他表插入分區表:

insert into/overwrite table sd_data_test partition (part='450',year='2017') 
select xx, yy from sale_detail; 

 
查詢:

select * from sd_data_test where part='543' AND year='2017'

 
這裏查詢的時候可以把分區字段當成普通字段來進行where條件的過濾。那插入後的數據是什麼樣子呢,可以在大數據開發套件中預覽一下表結構




可以看到分區列相當於表中的字段,可以和表中的其他字段一樣來使用。一般是放在where條件後抽取數據使用。
在表中實際的結構是什麼樣呢,其實分區相當於表中的子目錄。那麼如何查看呢,這裏我使用odps的一個
eclipse插件下載表結構。安裝eclipse插件可以參考https://help.aliyun.com/document_detail/27981.html?spm=5176.doc27800.6.756.04j9A9
調試代碼時會下載表結構和小部分數據。sd_data_test的表結構如圖:


  想必看到這個圖就很清楚分區列和表字段的關係了。在查詢的時候不會掃描全部表,而是去查某個分區目錄下的數據,可以有效的提高查詢效率。

二,靜態分區,動態分區
靜態分區和動態分區是對應的。所謂靜態分區就是指在插入分區表的時候要指定分區值,比如上麵例子

insert into/overwrite table sd_data_test partition (part='450',year='2017') 

 

這裏指定的part和year的值,插入之前要指定具體的分區值。動態分區在插入前時候不指定,插入時指定源表的一個字段(多級分區指定多個),那麼在插入的時候相同的字段值會自動創建成一個分區。

下麵就介紹下動態分區具體的用法,假設一個場景用戶有一年12個月的中國各個省份的數據資料。那想對這個表的數據進行分區,靜態分區比較繁瑣,可以使用動態分區。
假設 A表是源表非分區表,B表是分區表

CREATE TABLE A (
mon STRING,
pro STRING,
aa DATETIME,
bb STRING, cc STRING, dd STRING )

CREATE TABLE B(
xx1 STRING,
xx2 STRING,
xx3 DATETIME, xx4 STRING) PARTITIONED BY (month STRING,province STRING ) 動態插入,在select中指定按照哪兩個字段(因為對應的分區列有兩個)進行動態分區 。 insert into table B partition(month,province)select aa,bb,cc,dd,mon,pro from A 紅色標注的兩個字段是動態分區的時候按照這兩個字段進行分區,當然也可以按照一個分區列進行分區,但必須指定前麵的高級分區列 例如 insert into table B partition(month=‘12’,province)select aa,bb,cc,dd,pro from A

三,odps分區的一些注意事項:

  • 目前,在使用動態分區功能的SQL中,在分布式環境下,單個進程最多隻能輸出512個動態分區,否則引發運行時異常;
  • 在現階段,任意動態分區SQL不允許生成超過2000個動態分區,否則引發運行時異常;
  • 動態生成的分區值不允許為NULL,也不支持含有特殊字符和中文,否則會引發異常,如:“FAILED: ODPS-0123031:Partition exception - invalid dynamic partition value: province=xxx”;
  • 如果目標表有多級分區,在運行insert語句時允許指定部分分區為靜態,但是靜態分區必須是高級分區;

還有一點就是如果動態分區,來源表數據量非常大並且分區字段數據分布不均勻容易產生數據傾斜問題,建議先做好規劃,比如先將數據量非常大的那個分區值過濾隨後靜態分區單獨插入。

總結:合理設置分區,可以大幅度提高查詢速度降低使用費用,因為Maxcompute收費一部分來源於sql計算,設置分區表在計算時指定計算的分區,參與計算的數據不會掃描全表而是指定的部分分區表數據。
另外從計算性能上來說,如果分區數據過多了也會適得其反影響性能,甚至會超出Maxcompute的限製。所以合理使用分區表會給計算業務帶來很好的優化效果。

 


最後更新:2017-05-15 20:31:07

  上一篇:go  勒索病毒引出重大話題:公有雲比私有雲更安全?
  下一篇:go  大數據阿裏雲產品的簡單介紹理解