Hive是基于Hadoop的一个数据仓库,可以将结构化的数据文件映射为一张表,并提供类sql查询功能,Hive底层将sql语句转化为mapreduce任务运行。Hive是一个数据仓库,不支持行级插入、更新以及删除操作。Hive共有四种表,分别是内部表、外部表、分区表和桶表。
1. 内部表
内部表有时也被称为管理表。这种表会控制着数据的生命周期,Hive默认情况下会将这些表的数据存储在由配置项hive.metastore.warehouse.dir所定义的目录的子目录下。当我们删除内部表时,同时会删除这个表中的数据。内部表不方便与其他工具共享数据。
创建一个内部表可以用如下语句:
#字段之间以逗号分隔
create table table_name(id int, name string) row format delimited fields terminated by ',';
2. 外部表
外部表指向特定目录的一份数据,Hive并不对该数据具有所有权。当删除表时,不会删除该目录下的数据,数据可以被多个工具共享。即外部表只是对数据进行逻辑管理,创建一个外部表需要用external关键字:
#location指明了该表指向的数据
create external table table_name(id int, name string) row format delimited fields terminated by ',' location '/data/order/order.data';
3. 分区表
分区表是一种内部表。分区表通过指定一个或多个partition key,决定数据存放方式,进而优化数据的查询。每个表可以指定多个partition key,每个partition在hive中以文件夹的形式存在。如下所示是对数据的年份进行分区,每个年份对应一个文件夹,年份相同的数据会放到同一个文件夹下:
创建分区表时要注意开启允许动态分区设置,必要的时候还需要设置允许创建的最大分区数。
#开启动态分区功能
set hive.exec.dynamic.partition=true;
#允许所有分区都是动态的
set hive.exec.dynamic.partition.mode=nonstricr;
#设置每个mapper或reducer可以创建的最大动态分区个数
set hive.exec.max.dynamic.partitions.pernode=1000;
#设置一个动态分区创建语句可以创建的最大分区个数
set hive.exec.dynamic.partitions=10000;
#全局可以创建的最大文件个数
set hive.exec.max.created.files=100000;
创建分区表可以用以下语句:
#指定year为分区键,注意分区键不能同时出现在table_name后面,否则会报错
create table table_name(id int, name string) partitioned by(year int) row format delimited fields terminated by ',';
4. 桶表
桶表也是内部表,桶表是对某一列的数据进行哈希取值以将数据打散,然后放到不用文件中存储。在Hive分区表中,分区中的数据量过于庞大时,建议使用桶。在分桶时,对指定字段的值进行hash运算得到hash值,并使用hash值除以桶的个数取余进行分桶。分桶后的查 询效率比分区后的查询效率更高。下图是按照年份分区,再按id进行分桶后的结构:
建表语句:
#该表按照year进行分区,每个分区又分成四个桶
create table table_name(id int, name string) partitioned by(year int) clustered by(id) into 4 buckets;
end!
网友评论