寫在前面的話:linux
該系列博文是我學習《 Hive源碼解析與開發實戰》視頻課程的一個筆記,或者說總結,暫時沒有對視頻中的操做去作驗證,只是純粹的學習記錄。sql
有興趣看該視頻的博友能夠留言,我會共享出來,相互交流學習 ^.^。數據庫
*********************************************************************************************************工具
由於hive執行的結果數據是保存在hdfs上面的,因此能夠直接用hadoop命令將數據導出。主要包括get和text。oop
演示:學習
因而在相應目錄下就多了一個newdata的文件,其中/*的星號表示獲取該目錄下全部文件的全部內容,而後追加到newdata文件中去。注意第一個路徑是hdfs上的路徑,第二個路徑是得到的數據要存放到本地那個位置。spa
上面這個命令把/warehouse/testext/目錄下全部文件的全部內容打印到控制檯,固然若是想保存到本地某個文件能夠用linux重定向寫到一個文件中(固然也能夠用>>來追加):3d
使用 hadoop fs -text 命令能夠對多種數據格式文件進行操做,也就是說適合多種文件格式的數據導出。orm
把查詢的結果保存到本地的一個目錄或者hadoop的hdfs上。其中第二行的row format表示保存的數據以什麼樣的分隔符保存,這種只在本地保存的狀況才支持,hdfs上保存不支持這種寫法。視頻
演示:
這種方式須要在hive客戶的執行。
最終會在data3這個目錄下生產一個文件,這個文件包含了查詢結果的數據:
查看該文件內容:
這裏因爲咱們在insert的時候沒有指定分隔符,因此在這裏採用hive默認的分割符。咱們指定下分隔符:
因爲這裏我設置一'\t'做爲分割符,因此結果爲:
另外還能夠將數據保存到hdfs上去,但這樣就不可以使用row format,不然會報錯,因此輸入下面的命令:
執行完上述命令後會在hdfs相應的目錄下產生結果。
查看結果以下:
因爲這種方式沒法指定分隔符,因此採用了系統默認的分隔符I,這能夠說是Hive的缺陷,由於hdfs上不容許再指定分隔符了。這樣的話不如寫到本地目錄,還能夠指定分割符。
hive -f/e | sed/grep/awk >file
好比sqoop,把非關係型數據庫和關係型數據庫互相導入。
注意:下面動態分區的兩個參數應該爲nonstrict和strict而不是nonstrick;下面可能寫錯了。
使用動態分區以前,須要設定一些參數:
一個表一天產生的分區數最多不要超過1000個分區,不然的話,Mysql會出問題。
使用動態分區,上面配置的前兩個必須設置,後面的設置是可選的。固然這些設置是直接在hive終端中設置,僅對當前hive終端有效。
演示:
①首先建立一個分區表:
雖然這個時候指明瞭分區字段,但此時尚未分區,同時也沒有數據。
而後咱們考慮經過查詢向其中插入數據:
首先對比以前往指定分區插入數據的區別:
①以前,在往指定分區中插入數據的時候,指定分區是須要些分區字段值的,好比:partition(vale='34'),可是在這裏沒有;
②以前,只須要select查詢出要插入的字段值,不用查詢並指定分區字段值,也就是這裏多了:addr as value;
上面這條插入語句的意思是:從testext中查詢name和addr字段的值,其中name字段的值直接插入到d_part相應字段,addr字段指定爲分區字段;最後按照這樣的方式
插入d_part表中;這就是動態分區。
演示一個分區的狀況下的動態分區:
這裏報錯,由於hive默認是strict設置,即:靜態分區,所以咱們須要進行設置hive爲nonstrict,而且同時還要開啓動態分區:
而後咱們能夠看下該表是否有數據了,以及有哪些分區:
能夠看到這裏的幾個分區是動態根據查詢另一個表動態生成的。咱們能夠按照下面的方式查看下,89分區下面的值:
查看下hdfs上該表的目錄結構,發現確實產生了三個分區:
演示有兩個分區狀況下的動態分區:
①首先建立分區表:
②而後查詢插入數據,在hive終端輸入下面的語句:
另外查看屬性值,用"set 屬性名 " 的方式。
執行完插入以後,咱們能夠查看下分區:
注意前面的value是以及分區目錄,後面dt爲二級分區。
另外若是是靜態分區的話,那麼第一個分區必須是靜態分區,也就是在插入的時候,partition(...)中的第一個值必須進行賦值,固然也能夠有多個靜態分區,但靜態分區必須放在前面,好比:
最後注意:partition(。。)括號中字段順序必須和建立表的時候指定的分區順序一致,同時和後面select查詢插入字段的順序一致。