hive表分区
表分区是指将数据按照物理分层的方式进行区分开,加快查询的速度,同时也起到数据快照的作用!
创建分区表的关键字:partitioned by ,可以指定单个字段也可以指定多个字段;
partitioned by (dt String,country string);
create table pt_test(ts bigint,line string)
partitioned by (dt String,country string);
往分区表插入数据:
load data local inpath '/root/hive/partitions/file1' into table pt_test partition (dt='2001-01-01',country='GB’);
动态分区不能使用load加载数据,需要使用insert into
hive静态分区和动态分区
hive支持两种类型的分区:静态分区和动态分区
静态分区与动态分区的主要区别在于静态分区是手动指定,而动态分区是通过数据来进行判断。详细来说,静态分区的列实在编译时期,通过用户传递来决定的;动态分区只有在 SQL 执行时才能决定
默认创建的分区是静态分区,如果要指定动态分区可以通过以下配置:
查看表分区:
show partitions tbl;
如果要配置动态分区修改以下两个配置:
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
hive分桶
当单个分区或者表中的数据量越来越大,当分区不能更细粒的划分数据时,采用分桶技术将数据更细粒度的划分和管理。
分桶关键字:BUCKET
指定分桶的字段:clustered by (uid)
创建一个分桶表:
create table if not exists bucket(
uid int,
uname string,
uage int
)
clustered by (uid) into 4 buckets
row format delimited
fields terminated by ‘,’
加载数据:
load data local inpath '/usr/local/hive/test/3.txt' into table buc1 ;
分桶查询测试:
select * from buc1 cluster by (uid) ;
分桶表的查询:
查询全部
select * from buc3;
select * from buc3 tablesample(bucket 1 out of 1)
查询第几个桶数据
select * from buc3 tablesample(bucket 1 out of 4 on uid); //除4余0
select * from buc3 tablesample(bucket 1 out of 2 on uid);
tablesample(bucket x out of y on uid)
x:代表从第几桶开始查询
y:查询的总桶数,y可以是总的桶数的倍数或者因子;x不能大于y
分区与分桶:
1、分区使用的是表外字段,分桶使用的是表内字段
2、分桶是更细粒度的划分、管理数据,更多用来做数据抽样、JOIN操作
3、分区是粗粒度的将数据隔离,分桶是更加细粒度的将数据隔离
hive视图
1、视图是一个虚表,一个逻辑概念,可以概括出多张数据表
表是物理概念,数据放在表中,视图是虚表,操作视图和操作表是一样的,只不过视图下面不存储具体的数据
视图在创建时候,只是保存了一份元数据,当查询视图的时候,才开始执行视图对应的 那些子查询
2、视图是建立在已有表的基础上,视图赖以建立的这些表称为基表
3、视图可以简化复杂的查询
4、视图只能查询,不能 Load/Insert/Update/Delete 数据;
create view 视图表名 as select 基表1.字段1,基表1.字段2,基表2.字段1 ...... from 库名1.表名 库名2.表名 where 基表1.字段=基表2.字段
在mysql或者oracle中,视图是具体的存储数据的,一般称之为物化,物化之后对于一些复杂的查询查询可以提升效率
视图是只读的,只允许修改元数据中的tblproperties属性信息
hive视图的一些查询语句:
show views;
desc view_cdt;
查询视图
select
删除视图:
drop view view_cdt;
hive索引
Hive从0.7.0版本开始加入了索引,目的是提高Hive表指定列的查询速度。没有索引的时候,Hive在执行查询时需要加载整个表或者整个分区,然后处理所有的数据,但当在指定列上存在索引,再通过指定列查询时,那么只会加载和处理部分文件
索引是一种以空间换取时间的方式
hive索引的原理:
Hive的索引其实是一张索引表(Hive的物理表),在表里面存储索引列的值,该值对应的HDFS的文件路径,该值在数据文件中的偏移量。
当Hive通过索引列执行查询时,首先通过一个MR Job去查询索引表,根据索引列的过滤条件,查询出该索引列值对应的HDFS文件目录及偏移量,并且把这些数据输出到HDFS的一个文件中,然后再根据这个文件中去筛选原文件,作为查询Job的输入。
hive索引的好处:
可以避免全表扫描和资源浪费
可以加快含有group by的语句的查询速度
hive索引的语法
创建索引,未加载数据
create index test_index on table test(id)
as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'
with deferred rebuild
in table test;
生成索引数据
alter index test_index on test rebuild;
hive索引的一些缺点:
使用过程繁琐
需要额外的Job去扫描表,时间较长
数据更新,索引不会自动更新,需要手动进行更新