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去扫描表,时间较长

数据更新,索引不会自动更新,需要手动进行更新