hive学习笔记之三:内部表和外部表

2021-03-22  本文已影响0人  程序员欣宸

欢迎访问我的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

本篇概览

  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>结尾的:
在这里插入图片描述
  1. 新建数据库的文件夹都在/user/hive/warehouse下面,这是在中配置的,如下图红框:
在这里插入图片描述
  1. 删除数据库,加上<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

上一篇 下一篇

猜你喜欢

热点阅读