1. 程式人生 > >hive的內部表跟外部表

hive的內部表跟外部表

先建立一個內部表:
建表語句-進入hive命令列輸入:

create table t1(
    id      int
   ,name    string
   ,hobby   array<string>
   ,add     map<String,string>
)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
;

查看錶結構:

desc t1;

在這裡插入圖片描述

可以使用hiveserver2進行格式化的查詢:
在這裡插入圖片描述

往表中插入資料。
我們先看一下hdfs檔案系統,裡面在 /user/hive/warehouse/test01.db/t1 這個目錄裡面什麼都沒有。
我們使用hadoop上傳一個符合格式的檔案到這個目錄。
插入t1表中的資料:

1,xiaoming,book-TV-code,beijing:chaoyang-shagnhai:pudong
2,lilei,book-code,nanjing:jiangning-taiwan:taibei
3,lihua,music-book,heilongjiang:haerbin
hadoop fs -put t1.txt /user/hive/warehouse/test01.db/t1

在這裡插入圖片描述

在這裡插入圖片描述
這個t1.txtx檔案上傳成功。
只要上傳了,這些資料就會插入到t1表中。
在這裡插入圖片描述

在這裡插入圖片描述


建立一個外部表:

create external table t2(
    id      int
   ,name    string
   ,hobby   array<string>
   ,add     map<string,string>
)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
location '/user/hive/warehouse/'
;

看我寫的這個路徑 loaction ‘/user/hive/warehouse/’
在這個路徑下面本來是有test01.db這個資料夾的,在test01.db裡面有我之前上上傳的t1.txt。

然後上傳資料:

load data local inpath '/home/hadoop/apps/hiveData' overwrite into table t2;

然後查詢t2表就會發現會有資料:
但是奇怪的是:
/user/hive/warehouse 目錄下面只有t1.txt,其他的什麼都沒了,之前的test01.db檔案也沒了。
再次查詢t1表,發現裡面真的沒資料了,但是表還在。太奇怪了。


【個人對上面出現的問題的理解:】
首先我發現了這麼一個現象:
我如果建立了一個數據庫,假設我建立了test03這個資料庫:
那麼在hdfs檔案系統裡的 /user/hive/warehouse 這個目錄下面會出現這個檔案:

test03.db

在這裡插入圖片描述

如果我現在建立一個外部表t2:

create external table t2(
    id      int
   ,name    string
   ,hobby   array<string>
   ,add     map<string,string>
)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
location '/user/d3t2'

/user/d3t2 這個目錄一開始是沒有的,一旦我將t2這個外部表建立成功,那麼這個 /user/d3t2 目錄也會被建立。
在這裡插入圖片描述
這個是hive自動呼叫hadoop程式建立的,一開始裡面什麼都沒有。

然後我們往這個 /user/d3t2裡面載入資料。

load data local inpath '/home/hadoop/apps/hiveData/t2.txt' overwrite into table t2;

在這裡插入圖片描述
表裡面的資料就生成了。
在這裡插入圖片描述
t2.txt 檔案也會載入建表時設定的

如果此時我建一個內部表,

create table t1(
    id      int
   ,name    string
   ,hobby   array<string>
   ,add     map<string,string>
)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
;

在這裡插入圖片描述

此時在hdfs檔案系統中的目錄下面 /user/hive/warehouse/test03.db
會有一個t1資料夾。

在這裡插入圖片描述
剛開始這個t1資料夾裡面,當我們使用hadoop fs -put 將符合t1表格式的檔案上傳到這個資料夾裡面,那麼這個檔案裡面的資料都插入到t1表中。

在這裡插入圖片描述

hadoop fs -put t1.txt /user/hive/warehouse/test03.db/t1

在這裡插入圖片描述

t1表的資料已經被插入:
在這裡插入圖片描述

一旦我把這個表drop掉,hdfs檔案系統裡面的t1.txt也會消失。

hadoop fs -rm -r /user/hive/warehouse/test03.db/t1/t1.txt

在這裡插入圖片描述

表裡面的資料就被刪除了:
在這裡插入圖片描述

當把外部表的外部資料檔案也刪除,那麼外部表裡面的資料也會清空。

一旦使用 drop table t1
把內部表刪除了,那麼這張表會被刪除,對應的表插入的資料檔案也會被刪除。資料是沒法被恢復的。
但是對於外部表而言,即使是使用 drop table t2 將外部表刪除,但是隻要表裡面的資料檔案 t1.txt檔案沒刪除的話,重新使t2的建表語句,執行一下,這張表裡面的資料就會被恢復。

有關內部表與外部表的區別可以參考下面這篇部落格:

https://blog.csdn.net/qq_36743482/article/details/78393678