是指按照資料表的某列或某些列分為多個區,區從形式上可以理解為資料夾,比如我們要收集某個大型**的日誌資料,乙個**每天的日誌資料存在同一張表上,由於每天會生成大量的日誌,導致資料表的內容巨大,在查詢時進行全表掃瞄耗費的資源非常多。那其實這個情況下,我們可以按照日期對資料表進行分割槽,不同日期的資料存放在不同的分割槽,在查詢時只要指定分割槽欄位的值就可以直接從該分割槽查詢。
下面從用shell命令操作分割槽表和從hdfs檔案系統檢視分割槽表相結合的方式加深對分割槽表的認識。
第一,建立分割槽表並將本地檔案中的資料載入到分割槽表中。
要注意的是:首先,建立分割槽表的時候,要通過關鍵字 partitioned by (name string)宣告該表是分割槽表,並且是按照欄位name進行分割槽,name值一致的所有記錄存放在乙個分割槽中,分割槽屬性name的型別是string型別。當然,可以依據多個列進行分割槽,即對某個分割槽的資料按照某些列繼續分割槽。
其次,向分割槽表匯入資料的時候,要通過關鍵字partition(name=「jack」)顯示宣告資料要匯入到表的哪個分割槽,這裡表示要將資料匯入到分割槽為name=jack的分割槽。
再次,這裡要重點強調,所謂分割槽,這是將滿足某些條件的記錄打包,做個記號,在查詢時提高效率,相當於按資料夾對檔案進行分類,資料夾名可模擬分割槽字段。這個分割槽字段形式上存在於資料表中,在查詢時會顯示到客戶端上,但並不真正在儲存在資料表檔案中,是所謂偽列。所以,千萬不要以為是對屬性表中真正存在的列按照屬性值的異同進行分割槽。比如上面的分割槽依據的列name並不真正的存在於資料表中,是我們為了方便管理新增的乙個偽列,這個列的值也是我們人為規定的,不是從資料表中讀取之後根據值的不同將其分割槽。我們並不能按照某個資料表中真實存在的列,如userid來分割槽。
第二,檢視分割槽表目錄:
通過如下命令檢視分割槽表在檔案系統中的儲存路徑,我們會發現分割槽所依據的列反應在檔案路徑上,上面安裝name=「jack」分割槽,實際上是建立了乙個資料夾名為name=jack,並將該此匯入的資料放置該在資料夾下面。
大家會發現,在下圖中當我們使用cat命令檢視檔案內容時,會發現這個偽列也有顯示在客戶端,這其實只是顯示的一種效果而已,後面我們會同hdfs檔案系統檢視檔案內容,會發現檔案中其實沒有真正儲存這列資料。
第三,檢視分割槽資料:
分割槽的目的就是提高查詢效率,查詢分割槽資料的方式就是指定分割槽名,指定分割槽名之後就不再全表掃瞄,直接從指定分割槽(如name=jack的分割槽)中查詢,從hdfs的角度看就是從相應的檔案系統中(如name=jack資料夾下)去查詢特定的資料。如下圖所示:
第四,檢視分割槽資訊:
第五,向分割槽中插入資料:
在這個操作中,我們就可以驗證分割槽所依據的列其實是乙個偽列,如果你要從具有相同結構的分割槽表中匯入資料,會失敗。比如兩個分割槽表,都有兩個真實的列和乙個分割槽列(偽列),我們要將乙個分割槽表中的資料匯入到另乙個分割槽表,會報錯。錯誤資訊顯示要匯入的表只有兩列(偽列不記在內,這說明其實資料表檔案中只有兩列),而源表卻有三列(將偽列計算在類),我覺得這是乙個bug。
分桶是相對分割槽進行更細粒度的劃分。分桶將整個資料內容安裝某列屬性值得hash值進行區分,如要安裝name屬性分為3個桶,就是對name屬性值的hash值對3取摸,按照取模結果對資料分桶。如取模結果為0的資料記錄存放到乙個檔案,取模為1的資料存放到乙個檔案,取模為2的資料存放到乙個檔案。
第一,如何分桶:
注意:第一,分桶之前要執行命令hive.enforce.bucketiong=true;
第二,要使用關鍵字clustered by 指定分割槽依據的列名,還要指定分為多少桶,這裡指定分為3桶。
第三,與分割槽不同的是,分割槽依據的不是真實資料表檔案中的列,而是我們指定的偽列,但是分桶是依據資料表中真實的列而不是偽列。所以在指定分割槽依據的列的時候要指定列的型別,因為在資料表檔案中不存在這個列,相當於新建乙個列。而分桶依據的是表中已經存在的列,這個列的資料型別顯然是已知的,所以不需要指定列的型別。
第二,向桶中插入資料:
第三,檢視桶資訊:
由上圖可知分3個桶就是將資料表由乙個檔案儲存分為3個檔案儲存。
第四,檢視分桶資料:
要指定關鍵字tablesample。
3,分割槽又分桶。
可以對資料表分割槽之後繼續分桶。
但是分割槽之後繼續分桶,我們在hdfs檔案系統上看不出分桶的多個資料表檔案,只能看見乙個檔案,但是能從檔案路徑上看出分割槽的資訊。
看看分割槽又分桶的查詢結果:
Hive的分割槽表和分桶表的區別
1,hive分割槽。是指按照資料表的某列或某些列分為多個區,區從形式上可以理解為資料夾,比如我們要收集某個大型 的日誌資料,乙個 每天的日誌資料存在同一張表上,由於每天會生成大量的日誌,導致資料表的內容巨大,在查詢時進行全表掃瞄耗費的資源非常多。那其實這個情況下,我們可以按照日期對資料表進行分割槽,...
Hive的分割槽表和分桶表的區別
1.hive分割槽。是指按照資料表的某列或某些列分為多個區,區從形式上可以理解為資料夾,比如我們要收集某個大型 的日誌資料,乙個 每天的日誌資料存在同一張表上,由於每天會生成大量的日誌,導致資料表的內容巨大,在查詢時進行全表掃瞄耗費的資源非常多。那其實這個情況下,我們可以按照日期對資料表進行分割槽,...
Hive的分割槽表和分桶表的區別
1 hive分割槽 是指按照資料表的某列或某些列分為多個區,區從形式上可以理解為資料夾,比如我們要收集某個大型 的日誌資料,乙個 每天的日誌資料存在同一張表上,由於每天會生成大量的日誌,導致資料表的內容巨大,在查詢時進行全表掃瞄耗費的資源非常多。那其實這個情況下,我們可以按照日期對資料表進行分割槽,...