簡介
hive的表在hdfs上對應一個文件目錄,當使用hive進行select查詢操作時,會對這個目錄下的所有文件進行全表的掃描,其實這樣的查詢時很浪費性能的,這樣就引入了partiton(分區)和bucket(桶)的概念。
hive的分區和桶都是把hive的表進行分塊的操作,但是partiton是粗粒度的劃分,而bucket是細粒度的劃分,從而提高查詢的效率
分區表
分區表指的是創建表時,指定partition的分區空間
語法:
Partitioned by(par_col par_type)
partitioned by(字段名 字段類型)
動態分區和靜態分區
靜態分區是指用來分區的值是固定的,例如按天進行分區,這樣的分區就是固定的,因爲日期是固定的。動態分區與之相反,用來分區的值是不固定的,由輸入的數據來決定,這樣的分區表就可以稱爲動態分區。
關於動態分區和靜態分區的博文:
http://blog.csdn.net/baishuo491/article/details/39857885
動態分區和靜態分區是由 hive.exec.dynamic.partition來決定的,由set命令來制定,默認是開啓的
默認情況下模式設定hive.exec.dynamic.partition.mode爲strict(嚴格)的,一般我們將其更改爲nonstrict。在strict模式下,動態分區表必須設置至少一個分區字段爲靜態分區字段.而在nonstrice模式下,可以指定任意個動態分區字段
每一個分區值都會形成一個具體的分區目錄,例如用日期作爲表test的分區字段,就會在test這個表的目錄下生成多個以日期明明的目錄
- 分區字段爲僞字段,不能與表定義字段重名;
分區表的關鍵字
- partiton by 指定分區字段
- Clustered By 除了具有distrubuted by的功能外還兼備sort by的特點,所以最終的結果是每個reduce處理的數據不重疊,且每個Reduce內的數據是排序,從而達到全局有序的結果
- Sort By 保證同一個Reduce中的數據可以按定字段排序,使用sort by可以指定執行的reduce個數,sort by默認是升序的排序方式。
- Distributed By 按照指定字段將數據劃分到不同的輸出Reduce中,這樣可以保證每個Reduce所處理的數據是沒有排序的
http://blog.csdn.net/andrewgb/article/details/47359673
桶表(Bucketed Sorted Tables)
把表(或者分區)組織成桶有如下兩個原因
- 獲得更高的查詢處理效率
- 使(sampling)更加高效
傾斜表(SkewedTables)
用戶在建立表的時候如果知道這張表的某個字段在某值上會出現數據的傾斜,那麼可以建立傾斜表來解決這個問題
建表語法
CREATE TABLE USER(userid int,username string)
Skewed by(userid) on(null)[Stored as directories]
作用及原理
Skew table只是通過將傾斜特別嚴重的列分開存儲爲不同的文件,每個傾斜之指定爲一個目錄或者一個文件,因此查詢的時候,可以通過過濾傾斜來避免數據傾斜的問題,減少進行全表的掃描,節省性能.但是如果在使用傾斜表時,未設置過濾,仍會執行全表的掃描
臨時表(Temporary Tables)
只能在當前會話中可見的表稱爲臨時表,和關係型數據中的臨時表類似
建表語法
CREATE TEMPORARY TABLE TEST_TEMP(ID INT)
介紹
我們在hive中執行上述建表語句,再使用show tables;可以看到已經存在test_temp這張表.我們再打開一個終端,執行show tables,發現是沒有這張表的.這說明臨時表只在當前的session中才是可見的.
我們在hive中去執行desc formatted test_temp,我們發現臨時表的存儲路徑是不同於其他表的,他存儲在hdfs上的tmp文件夾下,而我們正常的表是會存儲在user目錄下的數據倉庫中
- 如果創建歷史表時,創建了一個與已存在表名相同的臨時表,則在當前會話中,所有對該表的使用都是指向臨時表(若要使用已存在的表,則需要對臨時表進行更名或者刪除的操作)
侷限性
建議僅做簡單實驗時使用
- 不支持分區字段
- 不支持建立索引