一、普通建表方式
create table stu_info(
id int,
name string
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
載入數據
load data local inpath '/data/hivetest/stu_info_local' into table stu_info;
load data inpath '/data/hivetest/stu_info_local' into table stu_info;
另外的方式
官網
二、子查詢方式建表
我們練習下
創建一個練習庫
創建一個普通表
create table normal(
id int,
name string
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
我們裝載數據
load data local inpath '/data/hivetest/stu_info_two' into table normal;
我們看數據是存在的
我們利用子查詢生成新表
create table normal_zcx_t as select * from normal;
實際在跑MapReduce
我們查看表和數據
我們可以看到元數據也存在
表結構也一樣
我們再看下HDFS
所以子查詢將查詢的數據和表的結構賦予一張新的表
三、Like建表
我們建表
create table normal_like_t like normal;
只有表結構,沒有數據,但是相對於子查詢沒有MapReduce執行,速度會快很多。
元數據和HDFS都有
四、數據共享
我們重新創建一個資料庫
創建員工表
創建部門表
導入數據
我們創建表引用另外一個表的文件,比如引入我們的dept表的文件
可以看到表
元數據也有
數據也有
我們把dept_yr數據清空,會發現dept的數據竟然也沒有了
那我們重新加載數據呢?
這時候我們明白了,它倆在一起關聯的,添加和清除在一起。
如果刪除的話 drop table dept_yr;數據還是清空
所以這種方式建表,他們是互相影響的。
數據共享一份數據,刪除的時候就把共享的數據刪除
刪除表也會把元數據數據刪除,清除HDFS上的文件
建表中,這有兩個關鍵字
如果我們不加這兩個關鍵字,表默認是管理表
我們先看TEMPORARY
我們創建
我們導入數據
去查詢元數據,發現沒有信息
用desc formatted查看,信息是有的
我們看其中的數據存放路徑
查看一下HDFS
這就是臨時表的一些特點
如果關閉的話,就會自動刪除臨時表,也可以手動刪除,常作為臨時結果使用。
如果用location+temporary共享數據會發生什麼呢?可以做個練習。(1)關閉客戶端對原始數據的影響?(2)刪除臨時表對原始數據的影響?(3)如果是清空臨時表呢?
我們創建EXTERNAL表
我們看元數據
Formatted
我們再dept中加載數據
發現數據在外部表也是有的
如果我們清空外部表,就會報錯
FAILED: SemanticException [Error 10146]: Cannot truncate non-managed table dept_ext.
那我們刪除外部表呢?不會對原始數據產生影響
元數據也沒了
練習:如果不使用location,直接創建的話,刪除表會怎麼樣?
總結:刪除表時,內部表元數據和數據一起刪除,而外部表只刪除元數據,不會刪除數據,以及HDFS上表對應的目錄及文件都不會刪除。