前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >hive学习笔记之三:内部表和外部表

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

原创
作者头像
程序员欣宸
修改2021-06-30 11:16:08
7640
修改2021-06-30 11:16:08
举报
文章被收录于专栏:实战docker实战docker实战docker

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos

《hive学习笔记》系列导航

  1. 基本数据类型
  2. 复杂数据类型
  3. 内部表和外部表
  4. 分区表
  5. 分桶
  6. HiveQL基础
  7. 内置函数
  8. Sqoop
  9. 基础UDF
  10. 用户自定义聚合函数(UDAF)
  11. UDTF

本篇概览

  • 本文是《hive学习笔记》系列的第三篇,要学习的是各种类型的表及其特点,主要内容如下:
  • 建库
  • 内部表(也叫管理表或临时表)
  • 外部表
  • 表的操作 接下来从最基本的建库开始

建库

  • 创建名为test的数据库(仅当不存在时才创建),添加备注信息test database
create database if not exists test 
comment 'this is a database for test';
  • 查看数据库列表(名称模糊匹配):
hive> show databases like 't*';
OK
test
test001
Time taken: 0.016 seconds, Fetched: 2 row(s)
  • describe database命令查看此数据库信息:
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)
  • 上述命令可见,test数据库在hdfs上的存储位置是hdfs://node0:8020/user/hive/warehouse/test.db,打开hadoop的web页面,查看hdfs目录,如下图,该路径的文件夹已经创建,并且是以.db结尾的:
在这里插入图片描述
在这里插入图片描述
  • 新建数据库的文件夹都在/user/hive/warehouse下面,这是在中配置的,如下图红框:
在这里插入图片描述
在这里插入图片描述
  • 删除数据库,加上if exists,当数据库不存在时,执行该语句不会返回Error:
hive> drop database if exists test;
OK
Time taken: 0.193 seconds

以上就是常用的库相关操作,接下来实践表相关操作;

内部表

  • 按照表数据的生命周期,可以将表分为内部表和外部表两类;
  • 内部表也叫管理表或临时表,该类型表的生命周期时由hive控制的,默认情况下数据都存放在/user/hive/warehouse/下面;
  • 删除表时数据会被删除;
  • 以下命令创建的就是内部表,可见前面两篇文章中创建的表都是内部表:
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
t3
t4
t5
t6
t8_1
values__tmp__table__1
values__tmp__table__2
Time taken: 0.029 seconds, Fetched: 10 row(s)
  • 添加字段:
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)

至此,咱们对内部表和外部表已经有了基本了解,接下来的文章学习另一种常见的表类:分区表;

关于容器和镜像的环境

如果您不想自己搭建kubernetes环境,推荐使用腾讯云容器服务TKE:无需自建,即可在腾讯云上使用稳定, 安全,高效,灵活扩展的 Kubernetes 容器平台;

如果您希望自己的镜像可以通过外网上传和下载,推荐腾讯云容器镜像服务TCR:像数据加密存储,大镜像多节点快速分发,跨地域镜像同步

你不孤单,欣宸原创一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 数据库+中间件系列
  6. DevOps系列

欢迎关注公众号:程序员欣宸

微信搜索「程序员欣宸」,我是欣宸,期待与您一同畅游Java世界...

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 欢迎访问我的GitHub
  • 《hive学习笔记》系列导航
  • 本篇概览
  • 建库
  • 内部表
  • 外部表
  • 表的操作
  • 关于容器和镜像的环境
  • 你不孤单,欣宸原创一路相伴
  • 欢迎关注公众号:程序员欣宸
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档