1. 程式人生 > >Hive關於內部表外部表以及分割槽表資料刪除總結

Hive關於內部表外部表以及分割槽表資料刪除總結

1 內部表 

建立內部表語句:

create table dog(name string,id int) rowformat delimited fields terminated by " ";

a:本地載入資料  拷貝本地資料到/user/hive/warehouse/的對應目錄下,所謂的對應是指對應的資料庫的對應表目錄下。本地資料不會刪除。如果重複執行載入同一個資料的話,不會覆蓋,會對相同檔案加上字尾_copy_1

load data local inpath  '/home/daxin/jdata/dog' into table dog;

b:本地載入Hdfs上的資料,會將hdfs上的檔案移動

到/user/hive/warehouse/的對應目錄下。

c:刪除內部表:會刪除/user/hive/warehouse/對應的資料

結論: 內部表的資料由hive自身負責管理

2 外部表

a:本地載入資料:拷貝本地資料到/user/hive/warehouse/的對應目錄下,本地資料不會刪除。

Create external tabledog(name string,id int) row format delimited fields terminated by "";

load data localinpath  '/home/daxin/jdata/dog' intotable dog; //載入本地資料,本地資料還在

drop table dog;  //發現/user/hive/warehouse/目錄下依舊存在資料,所以沒有跟隨表刪除

b:本地載入Hdfs上的資料

load data  inpath '/dog' into table dog; //載入hdfs資料會將資料移動到/user/hive/warehouse/目錄下

drop table dog;  //發現/user/hive/warehouse/目錄下依舊存在資料,所以沒有跟隨表刪除

再次建立表:Create external tabledog(name string,id int) row format delimited fields terminated by "";不進行載入資料,直接執行查詢,發現可以直接插上上次外部表的資料。所以上面執行的刪除表只是刪除表的元資料而已。

結論: 外部表的資料不由hive自身負責管理,雖然資料會被載入到/user/hive/warehouse/,但是不由hive管理。

3 指定LOCATION

指定載入資料的位置,不再是預設載入到/user/hive/warehouse/目錄下了。

a:內部表

Create table dog(name string,id int) rowformat delimited fields terminated by " "  LOCATION '/jdata/dog1/';

載入資料時候這次是載入到/jdata/dog1/目錄下,而不再是/user/hive/warehouse/目錄,刪除指定LOCATION的內部表的時候資料會一起刪除。

b:外部表

 Createexternal table dog(name string,id int) row format delimited fields terminatedby " "  LOCATION'/jdata/dog1/';

 載入資料時候這次是載入到/jdata/dog1/目錄下,而不再是/user/hive/warehouse/目錄。刪除指定LOCATION的外部表,資料還在/jdata/dog1/存在

結論: 除了載入資料存放的位置不在是/user/hive/warehouse/,其餘沒有區別

4分割槽表

單個屬性分割槽

建立分割槽表:

create table dog(name string,id int) partitionedby (sex string) row format delimited fields terminated by " ";

反例:

分割槽屬性不能在建立表的屬性集合中重複出現,例如:

reate table dog(name string,id int,sexstring) partitioned by (sex string) row format delimited fields terminated by" ";

報錯:FAILED:SemanticException [Error 10035]: Column repeated in partitioning columns

分割槽表載入資料:

load data local inpath  '/home/daxin/jdata/boy' into table dogpartition(sex="boy");

load data local inpath  '/home/daxin/jdata/girl' into table dogpartition(sex="girl");

注意:sex屬性是資料集裡面沒有的屬性,這個是提前分類好的資料然後載入。

HDFS儲存的資料結構:


刪除和內部表外部表刪除特性一致。

多個屬性分割槽

兩個屬性分割槽為例:

create table dog(name string,id int) partitionedby (sex string,cate string) row format delimited fields terminated by "";

分割槽列表屬性順序是有影響的,例如partitionedby (sex string,cate string)

當我們有雌雄兩種性別的泰迪、長毛時候,性別是一級分割槽標準,類別(cate)是耳機分割槽標準,這其實是一個樹的結構,分割槽屬性的先後表現在樹的層次上。

例如此例:



多個屬性可以根據分割槽刪除資料:

alter table dog drop partition(sex='boy');執行之後sex=boy下面的taidi、changmao兩種資料都會被刪除。可以這麼理解:樹的根節點刪除,子節點當然也跟隨刪除了。

alter table dog droppartition(sex='girl',cate='taidi'); 執行之後效果如下:



這個可以理解為直接刪除樹的葉子節點,不影響器兄弟節點。