hive 学习笔记之三:内部表和外部表,java 面试手写算法
删除表时数据会被删除;
以下命令创建的就是内部表,可见前面两篇文章中创建的表都是内部表:
create table t6(id int, name string)
row format delimited
fields terminated by ',';
向 t6 表新增一条记录:
insert into t6 values (101, 'a101');
使用 hadoop 命令查看 hdfs,可见 t6 表有对应的文件夹,里面的文件保存着该表数据:
[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
查看这个 000000_0 文件的内容,如下可见,就是表内的数据:
[hadoop@node0 bin]$ ./hadoop fs -cat /user/hive/warehouse/t6/000000_0
101 a101
执行命令 drop table t6;删除 t6 表,再次查看 t6 表对应的文件,发现整个文件夹都不存在了:
[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
[](
)外部表
创建表的 SQL 语句中加上 external,创建的就是外部表了;
外部表的数据生命周期不受 Hive 控制;
删除外部表的时候不会删除数据;
外部表的数据,可以同时作为多个外部表的数据源共享使用;
接下来开始实践,下面是建表语句:
create external table t7(id int, name string)
row format delimited
fields terminated by ','
location '/data/external_t7';
查看 hdfs 文件,可见目录/data/external_t7/已经创建:
[hadoop@node0 bin]$ ./hadoop fs -ls /data/
Found 1 items
drwxr-xr-x - hadoop supergroup 0 2020-10-31 12:02 /data/external_t7
新增一条记录:
insert into t7 values (107, 'a107');
在 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
试试多个外部表共享数据的功能,执行以下语句再建个外部表,名为 t8,对应的存储目录和 t7 是同一个:
create external table t8(id_t8 int, name_t8 string)
row format delimited
fields terminated by ','
location '/data/external_t7';
建好 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)
接下来删除 t7 表,再看 t8 表是否还能查出数据,如下可见,数据没有被删除,可以继续使用:
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)
把 t8 表也删掉,再去看数据文件,如下所示,依然存在:
[hadoop@node0 bin]$ ./hadoop fs -cat /data/external_t7/000000_0
107,a107
可见外部表的数据不会在删除表的时候被删除,因此,在实际生产业务系统
开发中,外部表是我们主要应用的表类型;
[](
)表的操作
再次创建 t8 表:
create table t8(id int, name string)
row format delimited
fields terminated by ',';
修改表名:
alter table t8 rename to t8_1;
可见修改表名已经生效:
hive> alter table t8 rename to t8_1;
OK
Time taken: 0.473 seconds
hive> show tables;
OK
alltype
t1
t2
评论