1.創建hive數據庫
$hive> create databses mydb2; //注意在hive中數據庫就是目錄
$hive>show databases ; //顯示數據庫
$hive>use mydb2;
$hive>create table t(id int,name string,age int);//創建一個表
$hive>create table mydb2.t(id int,name string ,age int); //在指定數據庫下面創建一個表
$hive>drop table mydb2.t; //刪除指定庫下面的表
$hive>insert into t3(id,name,age) values(1,'jack',34);//這個插入過程是通過mr的過程
$hive>hdfs dfs -cat /user/hive/warehouse/mydb1.db/t3/000000_0; //通過這樣的一個過程來進行插入數據的查詢
$hive>select *from t3 ; //這個地方實現在表t3中來查找數據
或者:$hive>dfs -lsr /; //通過這個語句來進行查詢
2.hive中的表
1.managed table:托管表,
2.external table :外部表
這兩個表的區別是:托管表在刪除表的時候數據也被刪除了,而外部表在刪除的時候,數據不會被刪除
- 內部表
create table test (name string , age string) location '/input/table_data';
注:hive默認創建的是內部表
此時,會在hdfs上新建一個test表的數據存放地
load data inpath '/input/data' into table test ;
會將hdfs上的/input/data目錄下的數據轉移到/input/table_data目錄下。刪除test表后,會將test表的數據和元數據信息全部刪除,即最后/input/table_data下無數據,當然/input/data下再上一步已經沒有了數據!
如果創建內部表時沒有指定location,就會在/user/Hive/warehouse/下新建一個表目錄,其余情況同上。
注:load data會轉移數據
- 外部表
create external table etest (name string , age string);
會在/user/hive/warehouse/新建一個表目錄et
load data inpath '/input/edata' into table etest;
把hdfs上/input/edata/下的數據轉到/user/hive/warehouse/et下,刪除這個外部表后,/user/hive/warehouse/et下的數據不會刪除,但是/input/edata/下的數據在上一步load后已經沒有了!數據的位置發生了變化!
本質是load一個hdfs上的數據時會轉移數據!
-
小結
最后歸納一下Hive中表與外部表的區別:1、在導入數據到外部表,數據並沒有移動到自己的數據倉庫目錄下(如果指定了location的話),也就是說外部表中的數據並不是由它自己來管理的!而內部表則不一樣;
2、在刪除內部表的時候,Hive將會把屬於表的元數據和數據全部刪掉;而刪除外部表的時候,Hive僅僅刪除外部表的元數據,數據是不會刪除的!- 在創建內部表或外部表時加上location 的效果是一樣的,只不過表目錄的位置不同而已,加上partition用法也一樣,只不過表目錄下會有分區目錄而已,load data local inpath直接把本地文件系統的數據上傳到hdfs上,有location上傳到location指定的位置上,沒有的話上傳到hive默認配置的數據倉庫中。
外部表相對來說更加安全些,數據組織也更加靈活,方便共享源數據。
那么,應該如何選擇使用哪種表呢?在大多數情況沒有太多的區別,因此選擇只是個人喜好的問題。但是作為一個經驗,如果所有處理都需要由Hive完成,那么你應該創建表,否則使用外部表!