博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hadoop: the definitive guide 第三版 拾遗 第十二章 之Hive分区表、桶
阅读量:6252 次
发布时间:2019-06-22

本文共 2126 字,大约阅读时间需要 7 分钟。

Hive分区表

在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作。有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念。分区表指的是在创建表时指定的partition的分区空间。

Hive可以对数据按照某列或者某些列进行分区管理,所谓分区我们可以拿下面的例子进行解释。

当前互联网应用每天都要存储大量的日志文件,几G、几十G甚至更大都是有可能。存储日志,其中必然有个属性是日志产生的日期。在产生分区时,就可以按照日志产生的日期列进行划分。把每一天的日志当作一个分区。
将数据组织成分区,主要可以提高数据的查询速度。至于用户存储的每一条记录到底放到哪个分区,由用户决定。即用户在加载数据的时候必须显示的指定该部分数据放到哪个分区。

实现细节

1、一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下。

2、表和列名不区分大小写。
3、分区是以字段的形式在表结构中存在,通过describe table命令可以查看到字段存在,但是该字段不存放实际的数据内容,仅仅是分区的表示。

语法

1. 创建一个分区表,以 ds 为分区列:

 

create table invites (id int, name string) partitioned by (ds string) row format delimited fields terminated by '\t' stored as textfile;

 

2. 将数据添加到时间为 2013-08-16 这个分区中:

 

load data local inpath '/home/hadoop/Desktop/data.txt' overwrite into table invites partition (ds='2013-08-16');

 

3. 将数据添加到时间为 2013-08-20 这个分区中:

 

load data local inpath '/home/hadoop/Desktop/data.txt' overwrite into table invites partition (ds='2013-08-20');

 

4. 从一个分区中查询数据:

 

select * from invites where ds ='2013-08-12';

 

5.  往一个分区表的某一个分区中添加数据:

 

insert overwrite table invites partition (ds='2013-08-12') select id,max(name) from test group by id;

 

 

可以查看分区的具体情况,使用命令:

 

hadoop fs -ls /home/hadoop.hive/warehouse/invites

 

如果想在 eslipse 下面看效果,也是需要开启 hadoop 的, start-all.sh 

Hive 桶

对于每一个表(table)或者分区,Hive可以进一步组织成桶。Hive也是针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。采用桶能够带来一些好处,比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。

1. 创建带桶的 table 

 

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

2.  强制多个  reduce  进行输出:

 

 

set hive.enforce.bucketing=true;

 

3. 往表中插入数据:

 

insert overwrite table bucketed_user select * from test;

 

4. 查看表的结构,会发现当前表下有四个文件:

 

dfs -ls /home/hadoop/hive/warehouse/bucketed_user;

 

5. 读取数据,看没一个文件的数据:

 

dfs -cat /home/hadoop/hive/warehouse/bucketed_user/000000_0;

 

桶使用 hash 来实现,所以每个文件拥有的数据的个数都有可能不相等。

6. 对桶中的数据进行采样:

 

select * from bucketed_user tablesample(bucket 1 out of 4 on name);

 

桶的个数从 1 开始计数,前面的查询从 4 个桶中的第一个桶获取数据。其实就是四分之一。

7. 查询一半返回的桶数:

 

select * from bucketed_user tablesample(bucket 1 out of 2 on name);

 

转载地址:http://upysa.baihongyu.com/

你可能感兴趣的文章
?:,reverse,vector的基本小结
查看>>
1.2 最基本的数据库连接
查看>>
bzoj4557
查看>>
C# 实验感悟WPF
查看>>
解决Win7 下小问题
查看>>
day25-3获取指定字符串中,大写字母、小写字母、数字的个数
查看>>
[转载] 百度上传&下载脚本
查看>>
Yii framwork - Url Manager
查看>>
为什么Facebook要将视频从Flash全面迁移到HTML5?
查看>>
poj 1149 PIGS
查看>>
mysql学习笔记--数据库视图
查看>>
SQL server 2005如何设置一个或几个字段唯一约束?
查看>>
典型用户分析
查看>>
java web编程 servlet读取配置文件参数
查看>>
ChartControl实现时间轴实现
查看>>
生成器函数
查看>>
Google(谷歌)中国工程研究院 工程师 方坤 对学生朋友的一些建议
查看>>
oracle 优化——索引与组合索引
查看>>
android基础—尺寸单位和屏幕适配
查看>>
小试 ScriptManager
查看>>