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)
y 必须是桶数的整数倍或者因子。hive根据 y 的大小,决定抽样的比例。x 表示从哪个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的一半
- hive学习笔记-分区表和桶表
- Hive 分区表和桶
- Hive学习笔记 --- Hive创建分区表
- Hive学习笔记 --- Hive分区表的操作
- hive 分区表、桶表和外部表
- Hive中 分区表和桶
- Hive学习笔记 3 Hive的数据模型:内部表、分区表、外部表、桶表、视图
- Hive学习笔记 --- Hive中创建分区表,并且查询数据
- Hadoop学习笔记(十八)---Hive内部表,外部表,分区表,桶表
- hive 中的二级分区表和动态分区表
- Hive 外部表 分区表
- Hive笔记三之内部表,外部表,分区表,桶表
- 分区表和桶表
- Hive表路径修改和分区表数据加载命令
- Hive分区表与分桶
- Hive分区表更改表结构
- hive 分区表、外部表、桶表
- hive表类型---桶表、分区表
- jenkins持续集成发邮件通知
- Vue 2.5 发布了
- 作业.输出满足1+2+3+n<8888的最大正整数n
- Codeforces 868F 分治优化Dp
- Linux 笔记
- hive学习笔记-分区表和桶表
- python中的函数
- RocketMQ源码解析-Consumer启动(2)
- easyUI中datagrid的fitColumns:true不起作用
- 浏览器的渲染:过程与原理
- 【Cassandra】bloom 过滤器
- 最简单有效的关于linux下配置Git操作免登录ssh公钥
- codeforces 559C Day at the Beach
- 将一个项目打成一个jar包,导入到另一个项目中并调用