1.HIVE 分区表
在 hive select 查询中一般会扫描整个内容,消耗很多时间组没必要的工作.有时候只需要扫描表中的一部分关心的数据,因此建表时引入了partition 概念.
分区表指的是在创建表时指定的partition的分区空间,Hive可以对数据按照某列或者某些列进行分区管理
\举个例子:当前互联网应用每天都要存储大量的日志文件,几G、几十G甚至更大都是有可能。存储日志,其中必然有个属性是日志产生的日期。在产生分区时,就可以按照日志产生的日期列进行划分。把每一天的日志当作一个分区
将数据组织成分区,主要可以提高数据的查询速度.至于用户储存的每一条记录到底放在哪个分区,由用户来决定.即用户在加载数据的时候必须现实地指定该部分数据放到哪.个分区
1.1实现细节
- 一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存放在表文件夹的目录下
- 表和列名不区分大小写
- 分区十一字段的形式在表结构中存在,通过describe table 命令可以查看到字段存在,但是该字段不存放实际的数据内容,仅仅是分区的表示
1.2语法
创建一个分区表:
create table table_name(
id int ,name string)
partitioned by (year int, month int)
row format delimited
fields terminated by '|'
collection items terminated by ','
map keys terminated by ':'
添加分区
alter table table_name add partition (year=2017,month=6) partition (year=2017,month=7) partition (year=2018,month=8);
动态分区的添加(在添加数据时自动生成分区)
注意:用户必须现制定一个静态分区列
先确认配置为true
set hive.exec.dynamic.partition
确认为true后再修改 hive.exec.dynamic.paritition.mode=nonstrict
set hive.exec.dynamic.partition.mode=nonstrict
自动添加一个没有的2018-9的分区
insert into table table_name partition (year=2018,month) values ('lisi','2018-8-12',8),('zhangsan','2018-9-10',9);
2.nonstrictHive 桶
对于每个表(table) 或者分区,hive 可以进一步组织成桶,也就是说桶时更为精细的数据范围划分.hive 也是针对某一列进行桶的组织. hive采用队列值哈希,然后除以桶的个数求余的方式决定该条记录存放在那个桶中
把表(或者分区)组织成桶有两个理由:
(1)获得更高的查询处理效率.桶为表加上了额外的结构,hive 在处理有些查询时利用这个结构,具体而言,连接两个在相同列上划分了桶的表,可以用map连接(map-side join) 高效的实现.比如join操作 对于join操作两个表有一个相同的列,如果对这两个表都进行了桶操作,那么将保存相同列值的通进行join操作就可以,可以大大减少join的数据量
(2)取样更高效.在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便
2.1语法
create table bucketed_user(
id int,name string)
clustered by (bucketed_user) into 2 buckets
row format delimited
fields terminated by '|'
collection items terminated by','
map keys terminated by ':'
stored as textfile;
随机抽样基于整行数据
select * from table_name tablesample(bucket 3 out of 32 on rand()) s;
随机抽样基于指定列(使用分桶列更高效)
select * from table_name tablesample(bucket 3 out of 32 on id) s;
随机抽样基于block size
SELECT * FROM table_name TABLESAMPLE(10 PERCENT) s;
SELECT * FROM table_name TABLESAMPLE(1M) s;
SELECT * FROM table_name TABLESAMPLE(10 rows) s;
3.Hive 视图常用操作
语法:
- 建立视图: create view view_name as select statement;
- 建立视图支持 CTE,ORDER BY,LIMIT,JOIN,etc
- 查找视图 show tables;(show views after hive v2.2.0)
- 显示view :show create table view_name;
- 删除视图:drop view_name;
- 更改视图属性 :alter view view_name set tblproperties('comment'='This is view');
- 更改视图定义:alter view view_name as select statement;
Hive 排序
- order by 会对数据进行全局排序,和oracle和mysql等数据库中的order by 效果一样,他只在一个reduce中进行,所以数据量特别大的时候效率特别低
- sort by 是单独在各自的reduce中进行排序,所以并不能保证全局排序,一般和distribute by一起执行,而且distribute by 要写在sort by 前面
- distribute by 会对指定的字段按照hashCode值对reduce的个数取模,然后将任务分配到对应的reduce中去执行,就是在mapreduce程序中的patition分区过程,默认根据指定key.hashCode()确定处理该人物的reduce
- cluster by :distribute by 和sort by 合用就相当于cluster by 但是 cluster不能指定排序asc或者desc的规则,只能是desc倒序排列
Hive 数据的导入与导出
load data 加 local 和不加local的区别
```local 是导入本地文件 采用复制方式
```不加local 是导入hdfs数据 采用剪切
use school;
export table class to 'tmp/out'(先将表导出到hdfs文件夹)
use school;
import table class2 from 'tmp/out'(再从dfs文件中导入新的表中)
HIVE 排序
row_number: 排名不重复,序号连续
rank:排名重复序号不连续
dense_rank:排名重复,序号连续