oracle 视图创建索引_Hive表分区与索引

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

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

希望本文对你有帮助!

感谢关注“码农星球”。本文版权属于“码农星球”。我们提供咨询和培训服务,关于本文有任何困惑,请关注并联系我们。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值