Hive内部表、外部表、分区表、桶表概述

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive内部表、外部表、分区表、桶表概述相关的知识,希望对你有一定的参考价值。

参考技术A   Hive是基于Hadoop的一个数据仓库,可以将结构化的数据文件映射为一张表,并提供类sql查询功能,Hive底层将sql语句转化为mapreduce任务运行。Hive是一个数据仓库,不支持行级插入、更新以及删除操作。Hive共有四种表,分别是内部表、外部表、分区表和桶表。

 1. 内部表

  内部表有时也被称为管理表。这种表会控制着数据的生命周期,Hive默认情况下会将这些表的数据存储在由配置项hive.metastore.warehouse.dir所定义的目录的子目录下。当我们删除内部表时,同时会删除这个表中的数据。内部表不方便与其他工具共享数据。

  创建一个内部表可以用如下语句:

 2. 外部表

  外部表指向特定目录的一份数据,Hive并不对该数据具有所有权。当删除表时,不会删除该目录下的数据,数据可以被多个工具共享。即外部表只是对数据进行逻辑管理,创建一个外部表需要用external关键字:

 3. 分区表

   分区表是一种内部表。分区表通过指定一个或多个partition key,决定数据存放方式,进而优化数据的查询。每个表可以指定多个partition key,每个partition在hive中以文件夹的形式存在。如下所示是对数据的年份进行分区,每个年份对应一个文件夹,年份相同的数据会放到同一个文件夹下:

  创建分区表时要注意开启允许动态分区设置,必要的时候还需要设置允许创建的最大分区数。

  创建分区表可以用以下语句:

 4. 桶表

  桶表也是内部表,桶表是对某一列的数据进行哈希取值以将数据打散,然后放到不用文件中存储。在Hive分区表中,分区中的数据量过于庞大时,建议使用桶。在分桶时,对指定字段的值进行hash运算得到hash值,并使用hash值除以桶的个数取余进行分桶。分桶后的查 询效率比分区后的查询效率更高。下图是按照年份分区,再按id进行分桶后的结构:

  建表语句:

  end!

hive数据库及表操作

目录

1.数据库操作

1.1 创建数据库

1.2 查询数据库

1.3 切换数据库

1.4 删除数据库

2.表操作

 2.1 创建内部表

 2.2 创建外部表

 2.3 内部表与外部表之间的转换

 2.4 加载数据

 2.5 修改表

 2.6 删除表

 2.7 分区表

 2.8 分桶表


1.数据库操作

1.1 创建数据库

(1)创建一个名为school数据库,数据库在HDFS上的默认存储路径是/user/hive/warehouse/*.db

hive (default)> create database school;

 (2) 避免要创建的数据库已经存在错误,增加if not exists判断

hive (default)> create database if not exists school_1;

(3)创建一个数据库,指定数据库在HDFS上存放的位置(注意:路径要精确到数据库名字)

hive (default)> create database if not exists school_2 location '/school.db';

1.2 查询数据库

(1)查询数据库

hive (default)> show databases;

(2)过滤显示查询的数据库

hive (default)> show databases like "school*";
OK
database_name
school
school_1
school_2
Time taken: 0.036 seconds, Fetched: 3 row(s)

 (3)显示数据库详细信息

hive (default)> desc database school;

1.3 切换数据库

  从当前数据库default切换到school数据库

hive (default)> use school;
OK
Time taken: 0.036 seconds
hive (school)> 

1.4 删除数据库

(1)删除空数据库

hive (school)> drop database school_1;

 (2)如果删除的数据库不存在命令会报错,最好采用if exists判断数据库是否存在

hive (school)> drop database if exists school_1;

 (3)如果数据库不为空,可以采用cascade命令,强制删除

hive (school)> drop database school_2 cascade;

2.表操作

创建表语法

create [external] table [if not exists] table_name [(col_name data_type[comment col_comment],...)]

[comment table_comment]

[partitioned by(col_namedata_type[comment col_comment],...)]

[clustered by(col_name,col_name,...)]

[stored as file_format]

[location hdfs_path]

字段解释说明

(1)create table创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用if not exists选项来忽略这个异常。

(2)external关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(location),Hive创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。

(3)comment:为表和列添加注释。

(4)partitioned by:创建分区表。

(5)clustered by:创建分桶表。

(6)stored as:指定存储文件类型。常用的存储文件类型:sequencefile(二进制序列文件)、textfile(文本)、rcfile(列式存储格式文件)如果文件数据是纯文本,可以使用stored as textfile。如果数据需要压缩,使用stored as sequence file。

(7)location:指定表在hdfs上的存储位置。

(8)like:允许用户复制现有的表结构,但是不复制数据

 2.1 创建内部表

(1)创建内部表stu1stu1表中包含有int类型字段idstring类型字段name,字段之间的分隔符为制表符","

hive (school)> create table if not exists stu1(id int,name string) row format delimited fields terminated by ',';

(2)根据查询结果创建表(查询的结果会添加到新创建的表中)

hive (school)> create table if not exists stu2 as select id,name from stu1; 

(3)根据已经存在的表结构创建表

hive (default)> create table if not exists stu3 like stu1;

(4)查询表的详细信息

hive (school)> desc formatted stu1;

 2.2 创建外部表

    创建外部表tea,tea表中包含有int类型字段idstring类型字段name,字段之间的分隔符为制表符","

hive (school)> create external table if not exists tea(id int,name string) row format delimited fields terminated by ',';

 2.3 内部表与外部表之间的转换

       (1) 修改内部表stu1为外部表

hive (school)> alter table stu1 set tblproperties('EXTERNAL'='TRUE');

        (2) 修改外部表tea为内部表

hive (school)> alter table tea set tblproperties('EXTERNAL'='FALSE');

  2.4 加载数据

   (1)将本地系统数据文件/export/data/student.txt加载到表stu1

hive (school)> load data local inpath'/export/data/student.txt' into table stu1;

     (2)  将HDFS上数据文件 /teacher.txt加载到表tea

hive (school)> load data inpath'/teacher.txt' into table tea;

2.5 修改表

   (1) 重命名

         将表stu1重命名为stu

hive (school)> alter table stu1 rename to stu;

(2)添加列

       给表stu添加int类型字段class

hive (school)> alter table stu add columns(class int);

(3)更换列

      将stu表中id字段更换为string类型字段number

hive (school)> alter table stu change column id number string;
OK
Time taken: 0.123 seconds
hive (school)> desc stu;
OK
col_name	data_type	comment
number              	string              	                    
name                	string              	                    
class               	int

(4)替换列

    将stu表中字段替换成int类型字段idstring类型字段name和int类型字段class

hive (school)> alter table stu replace columns(id int,name string,class int);
OK
Time taken: 0.107 seconds
hive (school)> desc stu;
OK
col_name	data_type	comment
id                  	int                 	                    
name                	string              	                    
class               	int

 2.6 删除表

     (1)删除表

hive (school)> drop table tea;

     (2) 清除表中数据,只能清除内部表,不能清除外部表

hive (school)> truncate table stu;

2.7 分区表

(1)创建分区表student,表中包含有int类型字段idstring类型字段name,分区字段int类型字段class,字段之间的分隔符为制表符","

hive (school)> create table student(id int,name string) partitioned by(class int) row format delimited fields terminated by ',';

 (2)添加分区

   添加单个分区

alter table student add partition(class=1);

  添加多个分区,分区之间空格隔开

hive (school)> alter table student add partition(class=2) partition(class=3);

 (3)查看表中分区信息

hive (school)> show partitions student;
OK
partition
class=1
class=2
class=3

 (4)通过where子查询加载对应分区数据

hive (school)> insert into table student partition(class=1) select id,name from stu where class=1;

 (5)查询指定分区

hive (school)> select * from student where class = 1;
OK
student.id	student.name	student.class
1	xiaoming	1
2	xiaohong	1
3	xiaogang	1

 (6)删除分区

        删除单个分区

hive (school)> alter table student drop partition(class=1);

        删除多个分区,分区之间用逗号隔开

hive (school)> alter table student drop partition(class=2),partition(class=3);

2.8 分桶表

 (1)开启hive分桶功能

hive (school)> set hive.enforce.bucketing = true;

 (2)创建分区表stu——cluster,表中包含有int类型字段idstring类型字段name和int类型字段class,分桶字段为class,分为3个桶,字段之间的分隔符为制表符","

hive (school)> create table stu_cluster(id int,name string,class int) clustered by(class) into 3 buckets row format delimited fields terminated by ',';

(3)通过中间表对数据进行分区 

hive (school)> insert overwrite table stu_cluster select * from stu cluster by(class);

以上是关于Hive内部表、外部表、分区表、桶表概述的主要内容,如果未能解决你的问题,请参考以下文章

Hive中内部表外部表分区表分桶表之间的关系

Hive的分区表与分桶表&内部表外部表

Hive探秘--内部表外部表分区表桶表研究

Hive常用命令

HIve数据存储

Hive 之表的种类以及相关操作