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上的檔案移動
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'); 執行之後效果如下:
這個可以理解為直接刪除樹的葉子節點,不影響器兄弟節點。