【大数据Hive】Hive 内部表与外部表使用详解

目录

一、hive 内部表简介

1.1 查看内部表信息

二、hive 外部表简介

三、内部表与外部表对比

四、内部表与外部表操作演示

4.1 内部表操作

4.1.1 数据准备

4.1.2 建表sql

4.2 外部表操作

4.2.1 建表sql

4.2.2 上传数据文件到 /stu目录

4.2.3 内部表删除

4.2.4 外部表删除

4.3 如何选择内、外部表

五、内部表、外部表与location的关系

5.1 location关键字不补充说明

5.2 操作演示

5.2.1 创建外部表,不指定location

5.2.2 创建内部表,指定location


一、hive 内部表简介

内部表(Internal table)也称为被Hive拥有和管理的托管表(Managed table)

默认情况下创建的表就是内部表,Hive拥有该表的结构和文件。换句话说,Hive完全管理表(元数据和数据)的生命周期,类似于RDBMS中的表。当删除内部表时,它会删除数据以及表的元数据。

还记得上一篇中关于hive建表的完整语法树吗,在建表sql中第一行提供了可选参数 EXTERNAL

 CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name

...

1.1 查看内部表信息

可以使用DESCRIBE FORMATTED tablename,来获取表的元数据描述信息,从中可以看出表的类型;

二、hive 外部表简介

外部表(External table)中的数据不是Hive拥有或管理的,只管理表元数据的生命周期。

要创建一个外部表,需要使用EXTERNAL语法关键字,删除外部表只会删除元数据,而不会删除实际数据。在Hive外部仍然可以访问实际数据

 实际场景中,外部表搭配location语法指定数据的路径,可以让数据更安全。

外部表不补充说明

1、创建外部表 需要关键字 external

2、外部表数据存储路径不指定 默认规则和内部表一致

3、也可以使用location关键字指定HDFS任意路径

如下为一个外表表建表sql

create external table student_ext(
 num int,
name string,
 sex string,
 age int,
dept string)
row format delimited
fields terminated by ','
location '/stu';

三、内部表与外部表对比

  • 无论内部表还是外部表,Hive都在Hive Metastore中管理表定义、字段类型等元数据信息;
  • 删除内部表时,除了会从Metastore中删除表元数据,还会从HDFS中删除其所有数据文件;
  • 删除外部表时,只会从Metastore中删除表的元数据,并保持HDFS位置中的实际数据不变;

四、内部表与外部表操作演示

4.1 内部表操作

4.1.1 数据准备

如下,为表映射的数据文件内容;

4.1.2 建表sql

默认情况下 ,不指定external,创建的表就是内部表

create table student(
     num int,
     name string,
     sex string,
     age int,
     dept string)
row format delimited
fields terminated by ',';

在hive的客户端的执行表的创建

也可以使用desc命令查看创建的表信息

describe formatted student;

4.2 外部表操作

4.2.1 建表sql

create external table student_ext(
   num int,
   name string,
   sex string,
   age int,
   dept string)
row format delimited
fields terminated by ','
location '/stu';

外部表补充说明

  • 创建外部表 需要关键字 external;
  • 外部表数据存储路径不指定 默认规则和内部表一致;
  • 也可以使用location关键字指定HDFS任意路径;

注意:如果未提前在hdfs目录创建出location里面的目录,建表的时候会自动创建

也可以使用describe命令查看详细信息

4.2.2 上传数据文件到 /stu目录

上传外部表数据文件

hdfs dfs -put ./students.txt /stu  

上传内部表数据文件

hdfs dfs -put ./students.txt /user/hive/warehouse/test.db/student

上传完成后就可以直接查看表数据了

 

4.2.3 内部表删除

接下来我们执行一下drop table tablename 命令,分别在Hive中和HDFS中查看效果

在当前的数据库下该表被删除了,切换到hdfs目录下查看,表对应的数据文件也删掉了;

 简单来说就是,内部表执行删除的时候,hive会将内部表自身的元数据信息,连同hdfs数据文件一并删除;

4.2.4 外部表删除

 删除外部表后再次去hdfs目录查看,发现此时数据文件仍然存在;

总结来说就是,删除外部表时只删除hive上的元数据信息,hdfs上面的数据仍然保留,因为这个特性,可以一定程度上确保原始数据的安全性;

4.3 如何选择内、外部表

根据上面的操作演示,在内部表与外部表的选择上做如下的建议:

  • 当需要通过Hive完全管理控制表的整个生命周期时,请使用内部表;
  • 当数据来之不易,防止误删,请使用外部表,因为即使删除表,文件也会被保留;

五、内部表、外部表与location的关系

通过上面的操作演示,好奇的同学不仅会在脑海里冒出下面的几个思考:

  • 在创建外部表的时候,可以使用location指定存储位置路径,如果不指定会如何?
  • 创建内部表的时候,是否可以使用location指定?
  • 是否意味着Hive表的数据在HDFS上的位置不是一定要在/user/hive/warehouse下?

5.1 location关键字不补充说明

1)在创建外部表的时候,可以使用location指定存储位置路径,如果不指定会如何?

如果不指定location,外部表的默认路径也是位于/user/hive/warehouse,由默认参数控制

2)创建内部表的时候,是否可以使用location指定?

内部表可以使用location指定位置的

3)是否意味着Hive表的数据在HDFS上的位置不是一定要在/user/hive/warehouse下?

不一定,Hive中表数据存储位置,不管内部表还是外部表,默认都在/user/hive/warehouse,当然可以在建表的时候通过location关键字指定存储位置在HDFS的任意路径

5.2 操作演示

5.2.1 创建外部表,不指定location

create external table student_ext_nolocation(
                                     num int,
                                     name string,
                                     sex string,
                                     age int,
                                     dept string)
    row format delimited
        fields terminated by ',';

执行创建表的sql;

再在hdfs目录中检查,发现就在默认的路径下:/user/hive/warehouse/test.db

5.2.2 创建内部表,指定location

create table student_inner(
   num int,
   name string,
   sex string,
   age int,
   dept string)
row format delimited
fields terminated by ','
location '/stu';

执行sql创建表,可以看到这种操作是可以的;

猜你喜欢

转载自blog.csdn.net/congge_study/article/details/128697570
今日推荐