Hive中的表类型

hive中的表类型

hive中是有多种表类型的,可以分为四种:内部表,外部表,分区表,桶表

内部表

内部表是hive默认表类型,表数据默认存储在warehouse目录中,在加载数据的过程中,实际数据会被移动到warehouse目录中,当删除表时,表的数据和元数据将会被同时删除

外部表

建表语句中包含external 的表叫外部表,外部表在加载数据的时候,实际数据并不会移动到warehouse目录中,只是与外部数据建立一个链接(映射关系),数据只是表对hdfs上的某一个目录的引用而已,当删除表定义的时候,数据依然是存在的。仅删除表和数据之间的引用关系,所以这种表是安全的,就算是误删表,数据还是存在的。

create external table external_table (
key string
) location '/data/external';

实际工作中,大部分用的是外部表,大致流程是这样的,先通过flume采集数据,把数据上传到hdfs中,然后在hive中创建外部表和hdfs上的数据绑定关系,就可以使用sql查询数据了,所以连load数据那一步都可以省略了,因为是先有数据,才创建的表。

内部表和外部表的相互转化

-- 内部表转外部表 
alter table tblName set tblproperties ('external'='true');
-- 外部表转内部表 
alter table tblName set tblproperties ('external'='false');

分区表

分区可以理解为分类,通过分区把不同类型的数据放到不同目录中,分区的标准就是指定分区字段,分区字段可以有一个或多个。
分区的意义在于优化查询,查询时尽量利用分区字段,如果不使用分区字段,就会全表扫描,最典型的一个场景就是把天作为分区字段,查询的时候指定天。

create table partition_1 (
id int,
name string 
) partitioned by (dt string)
row format delimited
fields terminated by '\t';

load data local inpath '/data/soft/hivedata/partition_1.data' into table;

外部分区表

外部分区表就是在外部表的基础上增加了分区,是工作中最常用的表

create external table ex_par(
id int,
name string
)partitioned by(dt string) 
 row format delimited  
 fields terminated by '\t'
 location '/data/ex_par';

针对外部分区表,通过hdfs的put命令把数据上传上去了,但是确查不到数据,就是因为没有在表中添加分区信息,那么如果绑定关系呢?就需要使用alter table tbname add partition 命令了,通过location指定分区目录

-- 绑定数据和分区之间的关系
alter table ex_par add partition(dt='2020-01-01') location '/data/ex_par/dt=2020-01-01';

-- load data ... partition 做了两件事情,上传数据,添加分区
load data local inpath '/data/soft/hivedata/ex_par.data' into table ex_par partition (dt='2020-01-01');

桶表

桶表是对数据进行哈希取值,然后放到不同文件中存储,物理上每个桶就是表(或分区)里的一个文件。
当数据不均衡的时候会用到桶表,比如,针对中国人口主要集中在河南,江苏,山东,广东,四川等地,西藏就三四百万比较少,如果使用分区表,把省份作为分区字段,数据会集中在某几个分区,这样计算的时候会出现数据倾斜的问题,效率会变得较低,这样从源头上解决,就可以采用分桶的概念,相对均匀的存放数据,也就是使用分桶表。

create table bucket_tb(
id int
) clustered by (id) into 4 buckets;

桶表不能用load data的方式加载数据,而是需要使用其它表中的数据,类似这样的写法:insert into table … select … from …。
在插入数据之前需要先设置开启桶操作,不然数据无法分到不同的桶里面,其实这里的分桶就是设置reduce任务的数量,因为分了多少桶,最终结果就会产生多少个文件,最终结果中文件的数量就和reduce任务的数量是挂钩的,设置完 set hive.enforce.bucketing=true; 可以自动控制reduce的数量从而适配bucket的个数。
桶表的主要作用:

  1. 数据抽样
    假如从一个大规模的数据集中,抽取部分数据进行查看,使用bucket表可以变得更加的高效。
select * from bucket_tb tablesample(bucket 1 out of 4 on id);
-- tablesample是抽样语句
-- 语法解析:tablesample(bucket x out of y on column)
-- y尽可能是桶表的bucket数的倍数或者因子,而且y必须大于等于x
-- y表示把桶表中的数据随机分为多少桶
-- x表示取出第几桶的数据
  1. 提高某些查询的效率
    例如:join 查询,可以避免产生笛卡尔积的操作
select a.id, a.name, b.addr from a join b on a.id=b.id;

如果a表和b表已经是分桶表,而且分桶的字段是id,那么这个操作的时候就不需要再进行全表笛卡尔积了,因为分桶之后相同的规则的id已经在相同的文件里面了,这样a表的每个桶就可以和b表的每个桶直接join,而不用全表join了

视图

hive中,也有视图的概念,视图实际上是一张虚拟表,是对数据的逻辑表示,它的主要作用是为了降低查询的复杂度

create view v1 as select  t3_new.id,t3_new.stu_name from t3_new;
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值