一、 有關Hive的一些小結:
- Hive 是一個建立在hadoop文件系統(tǒng)上的數據倉庫架構,可以用其對hdfs上數據進行分析與管理。
- 實際上是將hdfs上的文件映射成table(按文件格式創(chuàng)建table,然后hive的數據倉庫會生成對應的目錄,默認的倉庫路徑:user/hive/warehouse/tablename,目錄名與這個表名相同,這時只要將符合table定義的文件加載到該目錄便可通過Hql對整個目錄的文件進行查詢了。
- 將數據加載到該目錄可以用hdfs dfs -put 命令直接添加到該目錄;
- 也可以通過load data local inpath ‘user/test.txt’ into table tableName,通過load命令加載數據與通過put命令加載文件的結果是一樣的,即在user/hive/warehouse/tablename 目錄下都會有加載進來的文件,如果用load命令加載的是hdfs上的文件則會將原h(huán)dfs目錄下對應的文件移動至hive的倉庫目錄下),并將這些元數據保存到關系型數據庫中,元數據存儲著表所對應的文件路徑,表的列與分區(qū),表創(chuàng)建時間,文件大小等屬性;
- 同時支持用戶運用類sql對文件進行操作,這個操作主要是查詢。
hive 的數據模型中四種表:
- 1
- 2
- 3
- 4
- 5
二、內部表
- 表:Hive中的表和關系型數據庫中的表在概念上很類似,每個表在HDFS中都有相應的目錄用來存儲表的數據,這個目錄可以通過${HIVE_HOME}/conf/hive-site.xml配置文件中的hive.metastore.warehouse.dir屬性來配置,這個屬性默認的值是/user/hive/warehouse(這個目錄在HDFS上),我們可以根據實際的情況來修改這個配置。
- 如果我有一個表test,那么在HDFS中會創(chuàng)建/user/hive/warehouse/test目錄(這里假定hive.metastore.warehouse.dir配置為/user/hive/warehouse);test表所對應的所有數據都存放在這個目錄中。
- 如果刪除這張表,則表在關系數據中存儲的元數據以及在warehouse目錄下的數據也會被清除掉。
三、External Table 外部表
Hive中的外部表和表很類似,但是其數據不是放在自己表所屬的目錄中,而是存放到別處,這樣的好處是如果你要刪除這個外部表,該外部表所指向的數據是不會被刪除的,它只會刪除外部表對應的元數據;而如果你要刪除內部表,該表對應的所有數據包括元數據都會被刪除。
外部表操作演示:
1、創(chuàng)建外部表(創(chuàng)建的時候得用LOCATION 指定原數據存儲的路徑,不指定的話hive會在user/hive/warehouse下以外部表的表名創(chuàng)建目錄并將數據存儲在這里)
- 1
- 2
- 3
- 4
- 加載數據可用:hdfs dfs -put filename /usr/extends
也可用: hive>load data local inpath ‘/home/centosm/test/hive’ into table t_external;
執(zhí)行l(wèi)oad 命令之前數據如下所示:
執(zhí)行l(wèi)oad 命令之后:
- 2、查詢外部表內容
- 3、查詢外部表中的文件路徑
select INPUT__FILE__NAME from t_external;
- 4、如果刪除外部表,只會將其對應的元數據刪除了,目錄中的數據并不會被刪除
- 1
- 2
- 3
由上可見對應的數據并沒有被刪除。
綜上所述:外部表與內部表的區(qū)別如下
1、在導入數據到外部表,數據并沒有移動到自己的數據倉庫目錄下,也就是說外部表中的數據并不是由它自己來管理的!而表則不一樣;
- 2、在刪除表的時候,Hive將會把屬于表的元數據和數據全部刪掉;而刪除外部表的時候,Hive僅僅刪除外部表的元數據,數據是不會刪除的!
那么,應該如何選擇使用哪種表呢?在大多數情況沒有太多的區(qū)別,因此選擇只是個人喜好的問題。但是作為一個經驗,如果所有處理都需要由Hive完成,那么你應該創(chuàng)建表,否則使用外部表!
hadoop權威指南3如下建議
四、Partition分區(qū)表
- 在Hive中,表的每一個分區(qū)對應表下的相應目錄,所有分區(qū)的數據都是存儲在對應的目錄中。比如wyp表有dt和city兩個分區(qū),則對應dt=20131218,city=BJ對應表的目錄為/user/hive/warehouse/dt=20131218/city=BJ,所有屬于這個分區(qū)的數據都存放在這個目錄中。
下面以實際操作來明顯的展示分區(qū):
創(chuàng)建分區(qū)表:
- 1
- 2
- 3
- 4
查看表結構:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
向表中導入數據:
- 1
- 2
- 3
。。。。導入多個文件到不同分區(qū)
數據導完后查詢表中數據如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
查詢表分區(qū)
- 1
- 2
- 3
- 4
- 5
- 6
查詢hive存儲數據的目錄如下
- 1
- 2
- 3
- 4
由上述可知加載數據到分區(qū)后數據的目錄可能如下所述:
- 綜上所述,分區(qū)只不過是將表中指定的文件存儲到更細化的文件目錄中,比如以時間為分區(qū),那么每天的數據則會存儲到以日期為目錄的路徑下,當進行查詢時在sql中指定where那個分區(qū)時就不用進行全表查詢,而是只需要查詢某一天這個目錄下的數據,很明顯這么做大大地加快了查詢的速度。