Hive表的分区与分桶

1.Hive分区表

Hive使用select语句进行查询的时候一般会扫描整个表内容,会消耗很多时间做没必要的工作。Hive可以在创建表的时候指定分区空间,这样在做查询的时候就可以很好的提高查询的效率。

创建分区表的语法:

[java] view plain copy

  1. create table tablename(
  2. name string
  3. )partitioned by(key,type...);

示例

[java] view plain copy

  1. drop table if exists employees;
  2. create table  if not exists employees(
  3. name string,
  4. salary float,
  5. subordinate array<string>,
  6. deductions map<string,float>,
  7. address struct<street:string,city:string,num:int>
  8. ) partitioned by (date_time string,type string)
  9. row format delimited fields terminated by ‘\t‘
  10. collection items terminated by ‘,‘
  11. map keys terminated by ‘:‘
  12. lines terminated by ‘\n‘
  13. stored as textfile
  14. location ‘/hive/inner‘;

附:上述语句表示在建表时划分了date_time和type两个分区也叫双分区,一个分区的话就叫单分区,上述语句执行完以后我们查看表的结果会发现多了分区的两个字段。

[java] view plain copy

  1. desc employees;

结果如下:

注:在文件系统中的表现为date_time为一个文件夹,type为date_time的子文件夹。

向分区表中插入数据(要指定分区)

[java] view plain copy

  1. hive> load data local inpath ‘/usr/local/src/employee_data‘ into table employees partition(date_time=‘2015-01_24‘,type=‘userInfo‘);
  2. Copying data from file:/usr/local/src/employee_data
  3. Copying file: file:/usr/local/src/employee_data
  4. Loading data to table default.employees partition (date_time=2015-01_24, type=userInfo)
  5. OK
  6. Time taken: 0.22 seconds
  7. hive>

数据插入后在文件系统中显示为:

注:从上图中我们就可以发现type分区是作为子文件夹的形式存在的。

添加分区:

[java] view plain copy

  1. alter table employees add if not exists partition(date_time=‘2088-08-18‘,type=‘liaozhongmin‘);

注:我们可以先添加分区,再向对应的分区中添加数据。

查看分区:

[java] view plain copy

  1. show partitions employees;

附:employees在这里表示表名。

删除不想要的分区

[java] view plain copy

  1. alter table employees drop if exists partition(date_time=‘2015-01_24‘,type=‘userInfo‘);

再次查看分区:

2.Hive桶表

对于每一个表或者是分区,Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive是针对某一列进行分桶。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶中。分桶的好处是可以获得更高的查询处理效率。使取样更高效。

示例:

[java] view plain copy

  1. create table bucketed_user(
  2. id int,
  3. name string
  4. )
  5. clustered by(id) sorted by(name) into 4 buckets
  6. row format delimited fields terminated by ‘\t‘
  7. stored as textfile;

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

另外一个要注意的问题是使用桶表的时候我们要开启桶表:

[java] view plain copy

  1. set hive.enforce.bucketing = true;

现在我们将表employees中name和salary查询出来再插入到这张表中:

[java] view plain copy

  1. insert overwrite table bucketed_user select salary,name from employees;

我们通过查询语句可以查看插进来的数据:

数据在文件中的表现形式如下,分成了四个桶:

当从桶表中进行查询时,hive会根据分桶的字段进行计算分析出数据存放的桶中,然后直接到对应的桶中去取数据,这样做就很好的提高了效率。

时间: 2024-12-06 23:07:22

Hive表的分区与分桶的相关文章

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

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

Hive里的分区和分桶再谈

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

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表和分区的统计信息(Statistics)

类似于Oracle的分析表,Hive中也提供了分析表和分区的功能,通过自动和手动分析Hive表,将Hive表的一些统计信息存储到元数据中. 表和分区的统计信息主要包括:行数.文件数.原始数据大小.所占存储大小.最后一次操作时间等: 新表的统计信息 对于一个新创建的表,默认情况下,如果通过INSERT OVERWRITE的方式插入数据,那么Hive会自动将该表或分区的统计信息更新到元数据. 有一个参数来控制是否自动统计,hive.stats.autogather,默认为true. 举例来说: 先创

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

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

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 --------------

hive 中分桶抽样查询的原理刨析

先把大家都知道的分桶抽样查询 的语法以及用法po出 select * from 分桶表 tablesample(bucket x out of y on 分桶字段); 假设当前分桶表,一共分了z桶! x: 代表从当前的第几桶开始抽样 0<x<=y y: z/y 代表一共抽多少桶! y必须是z的因子或倍数! 怎么抽: 从第x桶开始抽,当y<=z每间隔y桶抽一桶,直到抽满 z/y桶 举例1: select * from stu_buck2 tablesample(bucket 1 out o