hive學習筆記之三:內部表和外部表

歡迎訪問我的GitHub

https://github.com/zq2599/blog_demos

內容:所有原創文章分類彙總及配套源碼,涉及Java、Docker、Kubernetes、DevOPS等;

《hive學習筆記》系列導航

  1. 基本數據類型
  2. 複雜數據類型
  3. 內部表和外部表
  4. 分區表
  5. 分桶
  6. HiveQL基礎
  7. 內置函數
  8. Sqoop
  9. 基礎UDF
  10. 用戶自定義聚合函數(UDAF)
  11. UDTF

本篇概覽

  • 本文是《hive學習筆記》系列的第三篇,要學習的是各種類型的表及其特點,主要內容如下:
  1. 建庫
  2. 內部表(也叫管理表或臨時表)
  3. 外部表
  4. 表的操作 接下來從最基本的建庫開始

建庫

  1. 創建名爲<font color="blue">test</font>的數據庫(僅當不存在時才創建),添加備註信息<font color="blue">test database</font>:
create database if not exists test 
comment 'this is a database for test';
  1. 查看數據庫列表(名稱模糊匹配):
hive> show databases like 't*';
OK
test
test001
Time taken: 0.016 seconds, Fetched: 2 row(s)
  1. <font color="blue">describe database</font>命令查看此數據庫信息:
hive> describe database test;
OK
test	this is a database for test	hdfs://node0:8020/user/hive/warehouse/test.db	hadoop	USER	
Time taken: 0.035 seconds, Fetched: 1 row(s)
  1. 上述命令可見,test數據庫在hdfs上的存儲位置是<font color="blue">hdfs://node0:8020/user/hive/warehouse/test.db</font>,打開hadoop的web頁面,查看hdfs目錄,如下圖,該路徑的文件夾已經創建,並且是以<font color="blue">.db</font>結尾的:

在這裏插入圖片描述 5. 新建數據庫的文件夾都在/user/hive/warehouse下面,這是在中配置的,如下圖紅框:

在這裏插入圖片描述 6. 刪除數據庫,加上<font color="blue">if exists</font>,當數據庫不存在時,執行該語句不會返回Error:

hive> drop database if exists test;
OK
Time taken: 0.193 seconds

以上就是常用的庫相關操作,接下來實踐表相關操作;

內部表

  1. 按照表數據的生命週期,可以將表分爲內部表和外部表兩類;
  2. 內部表也叫管理表或臨時表,該類型表的生命週期時由hive控制的,默認情況下數據都存放在<font color="blue">/user/hive/warehouse/</font>下面;
  3. 刪除表時數據會被刪除;
  4. 以下命令創建的就是內部表,可見前面兩篇文章中創建的表都是內部表:
create table t6(id int, name string)
row format delimited 
fields terminated by ',';
  1. 向<font color="blue">t6</font>表新增一條記錄:
insert into t6 values (101, 'a101');
  1. 使用hadoop命令查看hdfs,可見<font color="blue">t6</font>表有對應的文件夾,裏面的文件保存着該表數據:
[hadoop@node0 bin]$ ./hadoop fs -ls /user/hive/warehouse/t6
Found 1 items
-rwxr-xr-x   3 hadoop supergroup          9 2020-10-31 11:14 /user/hive/warehouse/t6/000000_0
  1. 查看這個<font color="blue">000000_0</font>文件的內容,如下可見,就是表內的數據:
[hadoop@node0 bin]$ ./hadoop fs -cat /user/hive/warehouse/t6/000000_0
101	a101
  1. 執行命令<font color="blue">drop table t6;</font>刪除t6表,再次查看<font color="blue">t6表</font>對應的文件,發現整個文件夾都不存在了:
[hadoop@node0 bin]$ ./hadoop fs -ls /user/hive/warehouse/
Found 5 items
drwxr-xr-x   - hadoop supergroup          0 2020-10-27 20:42 /user/hive/warehouse/t1
drwxr-xr-x   - hadoop supergroup          0 2020-10-29 00:13 /user/hive/warehouse/t2
drwxr-xr-x   - hadoop supergroup          0 2020-10-29 00:14 /user/hive/warehouse/t3
drwxr-xr-x   - hadoop supergroup          0 2020-10-29 13:04 /user/hive/warehouse/t4
drwxr-xr-x   - hadoop supergroup          0 2020-10-29 16:47 /user/hive/warehouse/t5

外部表

  1. 創建表的SQL語句中加上external,創建的就是外部表了;
  2. 外部表的數據生命週期不受Hive控制;
  3. 刪除外部表的時候不會刪除數據;
  4. 外部表的數據,可以同時作爲多個外部表的數據源共享使用;
  5. 接下來開始實踐,下面是建表語句:
create external table t7(id int, name string)
row format delimited 
fields terminated by ','
location '/data/external_t7';
  1. 查看hdfs文件,可見目錄<font color="blue">/data/external_t7/</font>已經創建:
[hadoop@node0 bin]$ ./hadoop fs -ls /data/
Found 1 items
drwxr-xr-x   - hadoop supergroup          0 2020-10-31 12:02 /data/external_t7
  1. 新增一條記錄:
insert into t7 values (107, 'a107');
  1. 在hdfs查看t7表對應的數據文件,可以見到新增的內容:
[hadoop@node0 bin]$ ./hadoop fs -ls /data/external_t7
Found 1 items
-rwxr-xr-x   3 hadoop supergroup          9 2020-10-31 12:06 /data/external_t7/000000_0
[hadoop@node0 bin]$ ./hadoop fs -cat /data/external_t7/000000_0
107,a107
  1. 試試多個外部表共享數據的功能,執行以下語句再建個外部表,名爲<font color="blue">t8</font>,對應的存儲目錄和<font color="blue">t7</font>是同一個:
create external table t8(id_t8 int, name_t8 string)
row format delimited 
fields terminated by ','
location '/data/external_t7';
  1. 建好t8表後立即查看數據,發現和t7表一模一樣,可見它們已經共享了數據:
hive> select * from t8;
OK
107	a107
Time taken: 0.068 seconds, Fetched: 1 row(s)
hive> select * from t7;
OK
107	a107
Time taken: 0.074 seconds, Fetched: 1 row(s)
  1. 接下來刪除<font color="blue">t7</font>表,再看<font color="blue">t8</font>表是否還能查出數據,如下可見,數據沒有被刪除,可以繼續使用:
hive> drop table t7;
OK
Time taken: 1.053 seconds
hive> select * from t8;
OK
107	a107
Time taken: 0.073 seconds, Fetched: 1 row(s)
  1. 把t8表也刪掉,再去看數據文件,如下所示,依然存在:
[hadoop@node0 bin]$ ./hadoop fs -cat /data/external_t7/000000_0
107,a107
  1. 可見外部表的數據不會在刪除表的時候被刪除,因此,在實際生產業務系統開發中,外部表是我們主要應用的表類型;

表的操作

  1. 再次創建t8表:
create table t8(id int, name string)
row format delimited 
fields terminated by ',';
  1. 修改表名:
alter table t8 rename to t8_1;
  1. 可見修改表名已經生效:
hive> alter table t8 rename to t8_1;
OK
Time taken: 0.473 seconds
hive> show tables;
OK
alltype
t1
t2
t3
t4
t5
t6
t8_1
values__tmp__table__1
values__tmp__table__2
Time taken: 0.029 seconds, Fetched: 10 row(s)
  1. 添加字段:
alter table t8_1 add columns(remark string);

查看錶結構,可見已經生效:

hive> desc t8_1;
OK
id                  	int                 	                    
name                	string              	                    
remark              	string              	                    
Time taken: 0.217 seconds, Fetched: 3 row(s)

至此,咱們對內部表和外部表已經有了基本瞭解,接下來的文章學習另一種常見的表類:分區表;

你不孤單,欣宸原創一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 數據庫+中間件系列
  6. DevOps系列

歡迎關注公衆號:程序員欣宸

微信搜索「程序員欣宸」,我是欣宸,期待與您一同暢遊Java世界... https://github.com/zq2599/blog_demos

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章