Hive之分区以及bucket分桶认识理解

1. 桶的概念:

对于每一个表(table)或者分区, Hive可以进一步组织成桶(没有分区能分桶吗?),
也就是说桶是更为细粒度的数据范围划分。Hive也是 针对某一列进行桶的组织。Hive采用
对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。
把表(或者分区)组织成桶(Bucket)有两个理由:
(1)、获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询时能利用
这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用
Map 端连接 (Map-side join)高效的实现。比如JOIN操作。对于JOIN操作两个表有一个
相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可
以,可以大大较少JOIN的数据量。
(2)、使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,
如果能在数据集的一小部分数据上试运行查询,会带来很多方便。

(3)、强制多个 reduce 进行输出:
插入数据前需设置,不设置将会只有一个文件:
set hive.enforce.bucketing = true
要向分桶表中填充数据,需要将 hive.enforce.bucketing 属性设置为 true。
这 样,Hive 就知道用表定义中声明的数量来创建桶。然后使用 INSERT 命令即可。
需要注意的是: clustered by和sorted by不会影响数据的导入,这意味着,用户必须自己负责数据如何如何导入,包括数据的分桶和排序。
‘set hive.enforce.bucketing = true‘ 可以自动控制上一轮reduce的数量从而适配bucket的个数,
当然,用户也可以自主设置mapred.reduce.tasks去适配bucket个数,推荐使用‘set hive.enforce.bucketing = true‘

原文地址:https://www.cnblogs.com/bloglintao/p/9197976.html

时间: 2024-10-10 21:18:49

Hive之分区以及bucket分桶认识理解的相关文章

Hive SQL之分区表与分桶表

Hive sql是Hive 用户使用Hive的主要工具.Hive SQL是类似于ANSI SQL标准的SQL语言,但是两者有不完全相同.Hive SQL和Mysql的SQL方言最为接近,但是两者之间也存在着显著的差异,比如Hive不支持行级数据的插入.更新和删除,也不支持事务操作. 注: HIVE 2.*版本之后开始支持事务功能,以及对单条数据的插入更新等操作 Hive的相关概念 Hive数据库 Hive中的数据库从本质上来说仅仅就是一个目录或者命名空间,但是对于具有很多用户和组的集群来说,这个

Hive 教程(四)-分区表与分桶表

在 hive 中分区表是很常用的,分桶表可能没那么常用,本文主讲分区表. 概念 分区表 在 hive 中,表是可以分区的,hive 表的每个区其实是对应 hdfs 上的一个文件夹: 可以通过多层文件夹的方式创建多层分区: 通过文件夹把数据分开 分桶表 分桶表中的每个桶对应 hdfs 上的一个文件: 通过文件把数据分开 在查询时可以通过 where 指定分区(分桶),提高查询效率 分区表基本操作 1. 创建分区表 partitoned by 指定分区,后面加 分区字段 和 分区字段类型,可以加多个

Hive里的分区和分桶再谈

 分桶是细粒度的,分桶是不同的文件. 分区是粗粒度的,即相当于,表下建立文件夹.分区是不同的文件夹. 桶在对指定列进行哈希计算时,会根据哈希值切分数据,使每个桶对应一个文件. 里面的id是哈希值,分过来的. 分桶,一般用作数据倾斜和数据抽样方面.由此,可看出是细粒度. Hive 中创建分区表没有什么复杂的分区类型(范围分区.列表分区.hash 分区,混合分区等).分区列也不是表中的一个实际的字段,而是一个或者多个伪列.意思是说,在表的数据文件中实际并不保存分区列的信息与数据. 注意:普通表(外部

Hive表的分区与分桶

1.Hive分区表 Hive使用select语句进行查询的时候一般会扫描整个表内容,会消耗很多时间做没必要的工作.Hive可以在创建表的时候指定分区空间,这样在做查询的时候就可以很好的提高查询的效率. 创建分区表的语法: [java] view plain copy create table tablename( name string )partitioned by(key,type...); 示例 [java] view plain copy drop table if exists emp

HIVE—索引、分区和分桶的区别

一.索引 简介 Hive支持索引,但是Hive的索引与关系型数据库中的索引并不相同,比如,Hive不支持主键或者外键. Hive索引可以建立在表中的某些列上,以提升一些操作的效率,例如减少MapReduce任务中需要读取的数据块的数量. 为什么要创建索引? Hive的索引目的是提高Hive表指定列的查询速度.没有索引时,类似'WHERE tab1.col1 = 10' 的查询,Hive会加载整张表或分区,然后处理所有的rows,但是如果在字段col1上面存在索引时,那么只会加载和处理文件的一部分

Hive中的分桶

对于每一个表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分.Hive也是针对某一列进行桶的组织.Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中. 把表(或者分区)组织成桶(Bucket)有两个理由: (1)获得更高的查询处理效率.桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构.具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现.比

Hive之分区(Partitions)和桶(Buckets)

转自:http://www.aahyhaa.com/archives/316 hive引入partition和bucket的概念,中文翻译分别为分区和桶(我觉的不是很合适,但是网上基本都是这么翻译,暂时用这个吧),这两个概念都是把数据划分成块,分区是粗粒度的划分桶是细粒度的划分,这样做为了可以让查询发生在小范围的数据上以提高效率. 首先介绍分区的概念,还是先来个例子看下如果创建分区表:[code lang=”sql”]create table logs_partition(ts bigint,l

Hive分区表与分桶

分区表 在Hive Select查询中,一般会扫描整个表内容,会消耗很多时间做没必要的工作. 分区表指的是在创建表时,指定partition的分区空间. 分区语法 create table tablename name string ) partitioned by(key type,-) create table if not exists employees( name string, salary string, subordinates array<string>, deduction

大数据--hive分桶查询&amp;&amp;压缩方式

一.分桶及抽样查询 1.分桶表创建 --------------------------------------- hive (db_test)> create table stu_buck(id int,name string) > clustered by(id) > into 4 buckets > row format delimited fields terminated by '\t';OKTime taken: 0.369 seconds --------------