hive学习笔记-分区表和桶表

来源:互联网 发布:linux查看端口 编辑:程序博客网 时间:2024/06/04 20:10


hive分区表和桶表



一. 分区表


为什么要对表进行分区:

分区是表的部分列的集合,可以为频繁使用的数据建立分区,这样查找分区中的数据时就不需要扫描全表,这对于提高查找效率很有帮助

庞大的数据集可能需要耗费大量的时间去处理。在许多场景下,可以通过分区或切片的方法减少每一次扫描总数据量,这种做法可以显著地改善性能


分区的基本概念:

分区是表的部分列的集合,可以为频繁使用的数据建立分区,这样查找分区中的数据时就不需要扫描全表,这对于提高查找效率很有帮助

分区是一种根据“分区列”(partition column)的值对表进行粗略划分的机制。Hive中的每个分区对应数据库中相应分区列的一个索引,每个分区对应着表下的一个目录,在HDFS上的表现形式与表在HDFS上的表现形式相同,都是以子目录的形式存在

一个表可以在多个维度上进行分区,并且分区可以嵌套使用



如何创建分区表:

创建分区表

create table if not exists emp_part(empno int,ename string,job string,mgr int,hiredate string,sal double,comm double,deptno int)PARTITIONED BY(date string,time string)row format delimited fields terminated by '\t';


添加分区(表已创建)

ALTER TABLE emp_part ADD PARTITION (date='2008-08-08', time='08:59') location '/path/ep1.txt' PARTITION (date='2008-08-08', time='09:00') location '/path/ep2.txt';


删除分区

ALTER TABLE emp_part DROP PARTITION (data='2008-08-08', time='08:59');


数据加载进分区表

LOAD DATA INPATH '/user/ep1.txt' INTO TABLE emp_part PARTITION(data='2008-09-08', hour='08:59'); LOAD DATA local INPATH '/user/ep2/*' INTO TABLE emp_part partition(data='2010-07-07', hour='09:00');


基于分区的查询语句

SELECT emp_part.* FROM emp_part WHERE emp_part.date>= '2008-08-08';


查询分区的语句

show partitions emp_part;


二. 桶表

什么是桶表:

1. 桶表是对数据进行哈希取值,然后放到不同文件中存储。

2. 数据加载到桶表时,会对字段取hash值,然后与桶的数量取模。把数据放到对应的文件中。
3. 物理上,每个桶就是表(或分区)目录里的一个文件,一个作业产生的桶(输出文件)和reduce任务个数相同。



使用桶表有什么好处:

1. 获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。具体而言,连接两个在相同列上划分了桶的表,可以使用 Map-side Join 的高效实现。

2. 抽样(sampling)可以在全体数据上进行采样,这样效率自然就低,它还是要去访问所有数据。而如果一个表已经对某一列制作了bucket,就可以采样所有桶中指定序号的某个桶,这就减少了访问量。


如何使用桶表:

我们使用桶表的时候要将hive.enforce.bucketing设置为true,表示让程序自动分配reduce的数量从而适配相应的bucket

<property>  <name>hive.enforce.bucketing</name>  <value>true</value>  <description>  Whether bucketing is enforced. If true, while inserting into the table,bucketing is enforced.   </description></property>


创建一张桶表

create table if not exists bucketed_student(    id int,    name string  )  clustered by(id) sorted by(name) into 4 buckets  row format delimited fields terminated by '\t'  stored as textfile; 

使用id来确定如何划分桶(Hive使用对值进行哈希并将结果除于桶的个数取余数的方式进行分桶)

通过name来进行排序



加载数据

load data [local] inpath '/user/hive/student.txt'[overwrite] into table bucketed_student;

通过文件来加载数据,加上local为从本地加载数据,不加local为从hdfs加载数据。

insert [overwrite] table bucketed_student select * from student;

加上overwirte表示覆盖数据,不加overwrite表示追加数据。



查看TableSample数据

select * from bucketed_student TableSample(bucket 2 out of 8 on id);

通常情况下,TABLESAMPLE将会扫描整个表然后抽取样本,显然这种做法效率不是很高。

由于在使用CLUSTERED BY时指定了分桶的列,如果抽样时TABLESAMPLE子句中指定的列匹配CLUSTERED BY子句中的列,TABLESAMPLE只扫描表中要求的分区。

TableSample是抽样语句,语法:TABLESAMPLE(BUCKET x OUT OF y ON column)

必须是桶数的整数倍或者因子。hive根据 的大小,决定抽样的比例。表示从哪个bucket开始抽取。

column 表示抽取样本的列,可以是非分区列中的任意一列,或者使用rand()表明在整个行中抽取样本而不是单个列。

 

假设该表在创建时使用了CLUSTEREDBY id INTO 32 BUCKETS

TABLESAMPLE(BUCKET 3 OUT OF 16 ON id)

因为y=16,一共有z=32 个buckets,也就是说TableSample把数据分成了z/y=2 个cluster,每个cluster都拥有 y=16 个 buckets

而且x=3,也是就是说从第 3 个buckets开始,一共 2 个 cluster 就是 抽取 第一个分区的3,第二个分区的3,就是抽取 3,19两个buckets


TABLESAMPLE(BUCKET 3 OUT OF 64 ON id) 

因为y=64, 一共有 z=64个buckets,也就是说TableSample把数据分成了 z/y=0.5 个cluster,每个buckets会拥有原来buckets的一半

而且x=3,也就是说会抽取第 3 个buckets的一半

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 注塑机上的料烤坨了怎么办 智能锁电机坏了怎么办 注塑机加热嘴内扣突了怎么办 tpu粘在螺杆上怎么办 注塑机锁模时会有射退动作怎么办 电动车刹车油泵不打油怎么办 cad转pdf颜色浅怎么办 松下多功能传真一体机卡纸怎么办 无刷电机坏了怎么办 6kv高压电机绝缘不合格怎么办? 400t油压机下降太慢怎么办 无法连线到服务器1~1怎么办? 数控车床车角度不亮怎么办 超市存包柜的票不见了怎么办 交货期来不及导致船期延误怎么办 跑1000米中途累怎么办 手指被机器压烂怎么办 机械手不能回归原点该怎么办 前缘送纸纸板翘怎么办 三菱AL 1R.2报警怎么办 工作好但领导不好伺候怎么办 孕妇憋尿憋的小腹疼怎么办 怀孕憋尿憋的小腹疼怎么办 半夜憋尿憋的小腹疼怎么办 新生儿大便次数较多怎么办 母猎生下三天没有奶怎么办 孩孑大便干不爱喝水怎么办 发那科1050报警怎么办 plc模块bf亮了怎么办 plc模块df亮了怎么办 西门子触摸屏进不了主画面怎么办 pos机显示白屏怎么办 洗衣机的门坏了怎么办 西门子洗衣机门坏了怎么办 拆线线断在肉里怎么办 总线绝对值编码器方向反了怎么办 台达伺服报警009怎么办 台达plc禁止上传怎么办? 潜水泵电机启动绕组断线了怎么办? 永磁电机磁没了怎么办 热水器热水管坏了怎么办