hive引入partition和bucket的概念,中文翻译分别为分区和桶(我觉的不是很合适,但是网上基本都是这么翻译,暂时用这个吧),这两个概念都是把数据划分成块,分区是粗粒度的划分桶是细粒度的划分,这样做为了可以让查询发生在小范围的数据上以提高效率。
分区的作用:使用分区可以加快数据分片的查询速度。
桶的作用:(1)获得更高效的查询处理效率,桶为表加上了额外的结构。
(2)"取样"更高效。在处理大规模数据集时,在开发和修改查询阶段,如果能在数据集的一小部分数据上试进行查询,会带来很多方便。
首先介绍分区的概念,还是先来个例子看下如果创建分区表:
create table logs_partition(ts bigint,line string) --ts timestamp line 每一行日志
partitioned by (dt string,country string) -- 分区列 dt 日志产生日期
创建分区表需要在定义表的时候声明分区列,这个分区列是个比较有意思的东西下面来看看,向表中导入数据:
load data local inpath 'input/hive/partitions/file1'
into table logs_partition
partition(dt='2001-01-01',country='GB');
.......
-- 看下表的结构
hive> desc logs_partition;
OK
ts bigint None
line string None
dt string None
country string None
# Partition Information
# col_name data_type comment
dt string None
country string None
Time taken: 0.265 seconds, Fetched: 10 row(s)
查看一个表的所有分区
hive> show partitions logs_partition;
OK
dt=2001-01-01/country=GB
dt=2001-01-01/country=US
dt=2001-01-02/country=GB
dt=2001-01-02/country=US
Time taken: 0.186 seconds, Fetched: 4 row(s)
导入完数据后看下hive数据仓库表logs_partition下的文件目录结构
/user/hive/warehouse/logs_partition
Screenshot from 2013-10-10 17:46:25
看到了吧分区列都成了目录了,这样查询的时候就会定位到某个目录下而大大提高了查询效率,在查看表结构的时候分区列跟其他列并无区别,看个查询语句:
SELECT ts, dt, line
FROM logs
WHERE country='GB';
1 2001-01-01 Log line 1
2 2001-01-01 Log line 2
4 2001-01-02 Log line 4
Time taken: 36.316 seconds, Fetched: 3 row(s)
这个查询只会查询file1, file2, file4这三个文件还有一个有趣的问题就是,查看下数据文件fieldX
里面都只包含两列ts和line并不包含dt和country这两个分区列,但是从查询结果看分区列和非分区列并无差别,实际上分区列都是从数据仓库的分区目录名得来的。
接下来说说桶,桶是更为细粒度的数据范围划分,它能使一些特定的查询效率更高,比如对于具有相同的桶划分并且jion的列刚好就是在桶里的连接查询,还有就是示例数据,对于一个庞大的数据集我们经常需要拿出来一小部分作为样例,然后在样例上验证我们的查询,优化我们的程序。
下面看看如何创建带桶的表
create table bucket_user (id int,name string)
clustered by (id) into 4 buckets;
关键字clustered声明划分桶的列和桶的个数,这里以用户的id来划分桶,划分4个桶。
以下为了简便划分桶的列简称为桶列
hive会计算桶列的hash值再以桶的个数取模来计算某条记录属于那个桶
向这种带桶的表里面导入数据有两种方式,一种是外部生成的数据导入到桶表,一种是利用hive来帮助你生成桶表数据
由于hive在load数据的时候不能检查数据文件的格式与桶的定义是否匹配,如果不匹配在查询的时候就会报错,所以最好还是让hive来帮你生成数据,简单来说就是利用现有的表的数据导入到新定义的带有桶的表中,下面来看看:
已经存在的表:
hive> select * from users;
OK
0 Nat
2 Joe
3 Kay
4 Ann
hive> set hive.enforce.bucketing=true --必须设置这个数据,hive才会按照你设置的桶的个数去生成数据
下面把user的数据导入到bucketed_users中
insert overwrite table bucketed-users
select * from users;
然后见证奇迹的时刻:
hive> dfs -ls /user/hive/warehouse/bucketed_users;
-rw-r--r-- 1 root supergroup 12 2013-10-10 18:48 /user/hive/warehouse/bucketed_users/000000_0
-rw-r--r-- 1 root supergroup 0 2013-10-10 18:48 /user/hive/warehouse/bucketed_users/000001_0
-rw-r--r-- 1 root supergroup 6 2013-10-10 18:48 /user/hive/warehouse/bucketed_users/000002_0
-rw-r--r-- 1 root supergroup 6 2013-10-10 18:48 /user/hive/warehouse/bucketed_users/000003_0
hive> dfs -cat /user/hive/warehouse/bucketed_users/000000_0;
0Nat
4Ann
下面来看看利用bucket来对示例数据进行查询
---带桶的表
select * from bucketed_users
tablesample(bucket 1 out of 4 on id);
---不带桶的表
select * from users
tablesample(bucket 1 out of 4 on rand());
tablesample的作用就是让查询发生在一部分桶上而不是整个数据集上,上面就是查询4个桶里面第一个桶的数据
相对与不带桶的表这无疑是效率很高的,因为同样都是需要一小部分数据,但是不带桶的表需要使用rand()函数,需要在整个数据集上检索。
分享到:
相关推荐
Hive分区表对应的是HDFS上独立的文件夹,该文件夹存放的是该分区的所有数据,其实分区就是分目录。Hive通过分区把一个大的数据集根据业务需要分割成小的数据集,在查询时能够通过where关键词选择指定分区,从而提高...
在Hive中,表分区是指将一个大表分割成多个小表,每个小表都有其自己的存储位置和索引。表分区可以提高数据查询的效率,因为可以根据查询条件来选择相应的分区进行查询。Hive提供了多种方式来创建表分区,包括静态...
Hive的架构优化是课程的重点,包括降低IO负载、表分区、动态分区、压缩和分布式缓存等技术,以提升Hive的性能。 针对HQL的优化,课程将深入探讨具体的策略和方法,包括Map和Reduce的优化、数据倾斜问题的解决,以及...
标题中提到的"Hive学习笔记-比较全的知识"和描述中所述"相当不错的,适合初学者,下载绝对不亏"意味着本篇文档旨在为初学者提供一个全面的学习指南,覆盖Hive的主要概念和操作。而标签"hive"确定了文档的中心主题是...
Hive 是一种基于 Hadoop 的数据仓库工具,...这些只是 Hive 部分核心概念和操作,实际使用中还涉及到更复杂的查询优化、性能监控、视图、索引、安全控制等多个方面。学习 Hive 需要结合实际场景和大量实践来加深理解。
通过上述内容的学习,我们不仅了解了Hive的基本概念、架构和安装过程,还深入探讨了Hive如何在Hadoop生态系统中发挥作用。对于初学者而言,掌握这些基础知识是十分重要的,这将帮助他们在后续的学习过程中更加顺利地...
Hive的学习不仅包括这些基本操作,还包括性能调优、视图、索引、UDF(用户自定义函数)的使用,以及如何与其他Hadoop组件如HBase、Spark集成等。理解Hive的工作原理和最佳实践,对于在大数据环境中进行高效的数据...
总的来说,《阿里巴巴Hive学习笔记》是一份详尽的资料,旨在帮助读者理解Hive的核心概念和操作,从而更好地利用Hive处理和分析海量数据。对于希望进入大数据领域的学习者来说,这是一份宝贵的资源。
1. **分桶与分区**:Hive支持表的分区和分桶,提高查询效率。分区是按照指定字段将数据逻辑上划分为多个部分,如按日期分区;分桶则是基于哈希函数将数据物理分割,用于优化JOIN操作。 2. **视图与索引**:视图可以...
- **桶**:进一步将分区内的数据按照哈希值划分成多个小文件,以支持采样和提高Join操作的性能。 ### Hive操作指南 4. **数据导入导出**: - 使用`LOAD DATA`命令将本地文件或HDFS文件加载到Hive表中。 - 使用`...
4. 索引:虽然Hive不支持传统意义上的数据库索引,但可以通过创建外部表和视图来实现类似的功能,提高查询速度。 在面试中,可能会遇到的问题涵盖以下几个方面: 1. Hadoop的两个主要组成部分是什么?它们各自的...
它提供了压缩、索引和列式存储等特性,能够极大地提高查询性能。然而,有时候在使用ORC格式读取数据时,可能会遇到“数组越界”错误,这通常是由于软件bug或者不兼容性导致的。 “数组越界”错误是Java编程语言中...
- **分桶表**:进一步优化,Hive允许在分区的基础上对数据进行分桶,每个桶是一个逻辑上的数据集合。分桶表有助于提高查询性能,尤其在执行Join操作时,通过匹配相同的桶号可以减少JOIN的计算量。然而,分桶设计需...
Hive的数据模型基于关系型数据库,包括数据库、表、分区和桶。其中,表可以被划分为多个分区,以提高查询效率;桶则用于实现数据的排序和并行处理。 四、Hive操作 1. 创建表:用户可以使用CREATE TABLE语句创建表,...
7. **视图与索引**:学习如何创建和使用视图简化复杂查询,以及Hive的索引机制,虽然Hive的索引功能相对有限,但仍然可以提高某些查询的速度。 8. **数据倾斜与优化**:了解数据倾斜问题,这是大数据处理中的常见...
8. **Hive分区和分桶** - **分区(Partitioning)**:根据特定列的值将数据划分为不同的目录,便于管理和查询。 - **分桶(Bucketing)**:基于哈希将数据分成固定数量的桶,有助于提高JOIN操作的效率。 理解并...
6. **性能优化**:探讨Hive的性能调优策略,如分区、分桶、索引的使用,以及查询优化技巧。 7. **Hive与外部系统集成**:理解如何将Hive与其他数据处理工具(如Pig、Spark、HBase等)集成,实现更复杂的数据处理...
实验内容不仅涵盖了上述的基本操作,还包括了对这些操作的实际应用,如创建和删除数据库,创建、修改和删除表,导入导出数据,以及管理表的分区和桶。通过这些实验,可以深入理解Hive的工作机制和使用方式,以及如何...
Hive的数据模型有四种:内部表、外部表、分区表和桶表。表的元数据保存传统的数据库的表中,当前Hive只支持Derby和MySQL数据库。 内部表:Hive中的表和传统数据库中的表在概念上是类似的,Hive的每个表都有自己的...
在大数据处理领域,Apache Hive 是一个非常重要的工具,它提供了SQL-like的语言(HQL)用于对存储在Hadoop上的大规模数据进行...在实际工作中,不断探索和学习新的优化策略,将使Hive在大数据场景下的表现更加出色。