Hive SQL(分区和分桶)

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 排序

  1. order by 会对数据进行全局排序,和oracle和mysql等数据库中的order by 效果一样,他只在一个reduce中进行,所以数据量特别大的时候效率特别低
  2. sort by 是单独在各自的reduce中进行排序,所以并不能保证全局排序,一般和distribute by一起执行,而且distribute by 要写在sort by 前面
  3. distribute by 会对指定的字段按照hashCode值对reduce的个数取模,然后将任务分配到对应的reduce中去执行,就是在mapreduce程序中的patition分区过程,默认根据指定key.hashCode()确定处理该人物的reduce
  4. 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:排名重复,序号连续

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章