1.Hive分區。
是指按照數據表的某列或某些列分爲多個區,區從形式上可以理解爲文件夾,比如我們要收集某個大型網站的日誌數據,一個網站每天的日誌數據存在同一張表上,由於每天會生成大量的日誌,導致數據表的內容巨大,在查詢時進行全表掃描耗費的資源非常多。那其實這個情況下,我們可以按照日期對數據表進行分區,不同日期的數據存放在不同的分區,在查詢時只要指定分區字段的值就可以直接從該分區查找。
下面從用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。
2,分桶。
分桶是相對分區進行更細粒度的劃分。分桶將整個數據內容安裝某列屬性值得hash值進行區分,如要安裝name屬性分爲3個桶,就是對name屬性值的hash值對3取摸,按照取模結果對數據分桶。如取模結果爲0的數據記錄存放到一個文件,取模爲1的數據存放到一個文件,取模爲2的數據存放到一個文件。
第一,如何分桶:
注意:第一,分桶之前要執行命令hive.enforce.bucketiong=true;
第二,要使用關鍵字clustered by 指定分區依據的列名,還要指定分爲多少桶,這裏指定分爲3桶。
第三,與分區不同的是,分區依據的不是真實數據表文件中的列,而是我們指定的僞列,但是分桶是依據數據表中真實的列而不是僞列。所以在指定分區依據的列的時候要指定列的類型,因爲在數據表文件中不存在這個列,相當於新建一個列。而分桶依據的是表中已經存在的列,這個列的數據類型顯然是已知的,所以不需要指定列的類型。
第二,向桶中插入數據:
第三,查看桶信息:
由上圖可知分3個桶就是將數據表由一個文件存儲分爲3個文件存儲。
第四,查看分桶數據:
要指定關鍵字tablesample。
3,分區又分桶。
可以對數據表分區之後繼續分桶。
但是分區之後繼續分桶,我們在hdfs文件系統上看不出分桶的多個數據表文件,只能看見一個文件,但是能從文件路徑上看出分區的信息。
看看分區又分桶的查詢結果:
原文:https://blog.csdn.net/JENREY/article/details/80588493