Hive的分桶表
【分桶概述】
Hive表分区的实质是分目录(将超大表的数据按指定标准细分到指定目录),且分区的字段不属于Hive表中存在的字段;分桶的实质是分文件(将超大文件的数据按指定标准细分到分桶文件),且分桶的字段必须在Hive表中存在。
- 可以提高多表join的效率(因为通过分桶已经将超大数据集提取出来了。假如原数据被分了4个桶,此时2表join的时候只需要读取符合条件的一个分桶,则理论上效率可提升4倍)
- 加速数据抽样的效率(理由同上,只需要按照指定规则抽取指定分桶的数据即可,不需要扫描全表)
select * from tableName tablesample(bucket x out of y on colum)。其中:
x:表示从第x个桶中抽取数据
y:表示每y个桶中抽取一次数据(必须是分桶数量的倍数 or 因子)
【用法简介】
1.开启支持分桶
set hive.enforce.bucketing=true; -- 默认:false --
设置为 true 之后,mr 运行时会根据 bucket 的个数自动分配 reduce task的个数。
当然,用户也可以通过 mapred.reduce.tasks 自己设置 reduce 任务个数,但分桶时不推荐使用。注意:一次作业产生的桶(文件数量)和 reduce task 个数一致)
2.往分桶表中加载数据
/* 往分桶表中插入数据的语法类似下面 */
insert into table bucket_table select columns from tbl; -- 全新插入 -- insert overwrite table bucket_table select columns from tbl; -- 覆盖重写 --
3.分桶表数据抽样
/*
抽样语法:TABLESAMPLE(BUCKET x OUT OF y)。其中:
x:表示从第x个桶中抽取数据
y:表示每y个桶中抽取一次数据(必须是分桶数量的倍数 or 因子)
*/
select * from bucket_table tablesample(bucket 1 out of 4 on columns);
【用法举例】
1. 假设本地文件 /root/hivedata/ft 中有以下内容:
zhang 12
lisi 34
wange 23
zhouyu 15
guoji 45
xiafen 48
yanggu 78
liuwu 41
zhuto 66
madan 71
sichua 89
2. 新建Hive常规表并导入本地文件:
hive> CREATE TABLE ft( id INT, name STRING, age INT)
> ROW FORMAT DELIMITED FIELDS TERMINATED BY'\t';
OK
Time taken: 0.216 seconds hive> load data local inpath'/root/hivedata/ft' into table ft;
Loading data to table hehe.ft
Table hehe.ft stats: [numFiles=1, totalSize=127]
OK
Time taken: 1.105 seconds hive> select *from ft;
OK
1 zhang 12
2 lisi 34
3 wange 23
4 zhouyu 15
5 guoji 45
6 xiafen 48
7 yanggu 78
8 liuwu 41
9 zhuto 66
10 madan 71
11 sichua 89
NULL NULL NULL
Time taken: 0.229 seconds, Fetched: 12 row(s)
3. 创建分桶表:
hive> create table fentong(
> id int,
> name string,
> age int,)clustered by(age) into 4 buckets -- 以字段age来划分成4个桶 --
> row format delimited fields terminated by ',';
每行数据具体落入几号分桶的规则如下:
- 用表中指定的字段值(比如age)来除以桶的个数4;
- 结果取余数,也就是求模(若余数为0就放到1号桶,余数为1就放到2号桶,余数为2就放到3号桶,余数为3就放到4号桶)
4. 给分桶表导入数据:
hive> insert into table fentong select name,age from ft;
5. 查询分桶表数据以确认正确导入:
hive> select * from fentong
6. 我们来看看分桶表的数据如何使用:
hive> select id, name, age from fentong tablesample(bucket 1 out of 4 on age);
OK
NULL NULL NULL
6 xiafen 48
1 zhang 12 hive> select id, name, age from fentong tablesample(bucket 2 out of 4 on age);
OK
11 sichua 89
8 liuwu 41
5 guoji 45 hive> select id, name, age from fentong tablesample(bucket 3 out of 4 on age);
OK
9 zhuto 66
7 yanggu 78
2 lisi 34
Hive的分桶表的更多相关文章
- 一起学Hive——创建内部表、外部表、分区表和分桶表及导入数据
Hive本身并不存储数据,而是将数据存储在Hadoop的HDFS中,表名对应HDFS中的目录/文件.根据数据的不同存储方式,将Hive表分为外部表.内部表.分区表和分桶表四种数据模型.每种数据模型各有 ...
- hive中的分桶表
桶表也是一种用于优化查询而设计的表类型.创建通表时,指定桶的个数.分桶的依据字段,hive就可以自动将数据分桶存储.查询时只需要遍历一个桶里的数据,或者遍历部分桶,这样就提高了查询效率 ------创 ...
- hive 分区表和分桶表
1.创建分区表 hive> create table weather_list(year int,data int) partitioned by (createtime string,area ...
- 第2节 hive基本操作:11、hive当中的分桶表以及修改表删除表数据加载数据导出等
分桶表 将数据按照指定的字段进行分成多个桶中去,说白了就是将数据按照字段进行划分,可以将数据按照字段划分到多个文件当中去 开启hive的桶表功能 set hive.enforce.bucketing= ...
- Hive 学习之路(五)—— Hive 分区表和分桶表
一.分区表 1.1 概念 Hive中的表对应为HDFS上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大. 分区为HDFS上表目录的子目录,数据按照分区存储在子目录中.如 ...
- Hive 系列(五)—— Hive 分区表和分桶表
一.分区表 1.1 概念 Hive 中的表对应为 HDFS 上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大. 分区为 HDFS 上表目录的子目录,数据按照分区存储在子 ...
- Hive 教程(四)-分区表与分桶表
在 hive 中分区表是很常用的,分桶表可能没那么常用,本文主讲分区表. 概念 分区表 在 hive 中,表是可以分区的,hive 表的每个区其实是对应 hdfs 上的一个文件夹: 可以通过多层文件夹 ...
- Hive SQL之分区表与分桶表
Hive sql是Hive 用户使用Hive的主要工具.Hive SQL是类似于ANSI SQL标准的SQL语言,但是两者有不完全相同.Hive SQL和Mysql的SQL方言最为接近,但是两者之间也 ...
- 入门大数据---Hive分区表和分桶表
一.分区表 1.1 概念 Hive 中的表对应为 HDFS 上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大. 分区为 HDFS 上表目录的子目录,数据按照分区存储在子 ...
随机推荐
- WPF上传图片到服务器文件夹
1.前端用ListBox加载显示多张图片 1 <ListBox Name="lbHeadImages" Grid.Row="1" ScrollViewer ...
- Android达到什么水平才能顺利拿到 20k 无压力?
程序员分很多种类和等级,如果要提高达到20k的概率,有两个条件如果满足的话,则很容易达到: 1.一线城市:北上广深杭 2.互联网行业 如果你非得抬杠,我要在三线城市,做外包要赚20k的话,很难,我自己 ...
- Android:Camera2的简单使用
以前用的是Camera,但是现在Camera已经被官方弃用了,所以这里使用的是Camera2进行演示 使用Camera需要注意的就是权限的获取,必须有权限 类图介绍 Camera2跟Camera1不一 ...
- 新手安装eclipse或idea后进行配置、快捷键、插件总结
.personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...
- 跟我一起写 Makefile(九)
使用函数 ---- 在Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能.make所支持的函数也不算很多,不过已经足够我们的操作了.函数调用后,函数的返回值可以当做 ...
- C语言中的stdin,stdout,stderr[转]
我们在写C程序时经常遇到printf(),fprintf(),perror(),这些东西到底有什么作用.说到这不得不提及stdin,stdout,stderr.想想,我们在用C去写文件时的操作,Fil ...
- 解决docker-compose下载过慢
https://blog.csdn.net/baidu_21349635/article/details/104628772
- STP相关概念
1)桥ID(Bridge ID)=Bridge Priority+MAC 2) 端口ID(Port ID)=Port Priority+Port No 3)桥根 4)非桥根 5)根端口 6)指定端口 ...
- MongoDB使用命令创建用户权错误分析--- 权限不够Error:couldn't add user:command createUser requires authentication
MongoDB使用命令创建用户权错误分析 错误一:权限不够Error:couldn't add user:command createUser requires authentication. 解决方 ...
- 【转】TCP和UDP的区别
转自:https://www.cnblogs.com/steven520213/p/8005258.html TCP和UDP是OSI模型中的运输层中的协议.TCP提供可靠的通信传输,而UDP则常被用于 ...