查看: 780|回复: 8

[笔记] hive分区

[复制链接]
论坛徽章:
9
Oracle研习者初级
日期:2013-03-16 21:09:06Oracle研习者初级
日期:2013-04-07 11:39:27Oracle研习者初级
日期:2013-04-18 13:19:15Oracle研习者高级
日期:2013-08-25 14:26:25nosql徽章
日期:2013-11-12 16:18:18Oracle研习者中级
日期:2014-09-19 14:31:38比特币徽章
日期:2014-11-06 14:54:26Oracle研习者高级
日期:2018-05-10 16:26:15Hive徽章
日期:2018-05-17 15:59:03
发表于 2018-4-8 23:58 | 显示全部楼层 |阅读模式

管理 Hive

分区简介
为了对表进行合理的管理以及提高查询效率,Hive可以将表组织成“分区”。
分区是表的部分列的集合,可以为频繁使用的数据建立分区,这样查找分区中的数据时就不需要扫描全表,这对于提高查找效率很有帮助。
分区是一种根据“分区列”(partition column)的值对表进行粗略划分的机制。Hive中每个分区对应着表很多的子目录,将所有的数据按照分区列放入到不同的子目录中去。



回复

使用道具 举报

论坛徽章:
9
Oracle研习者初级
日期:2013-03-16 21:09:06Oracle研习者初级
日期:2013-04-07 11:39:27Oracle研习者初级
日期:2013-04-18 13:19:15Oracle研习者高级
日期:2013-08-25 14:26:25nosql徽章
日期:2013-11-12 16:18:18Oracle研习者中级
日期:2014-09-19 14:31:38比特币徽章
日期:2014-11-06 14:54:26Oracle研习者高级
日期:2018-05-10 16:26:15Hive徽章
日期:2018-05-17 15:59:03
 楼主| 发表于 2018-4-8 23:58 | 显示全部楼层
为什么要分区?

庞大的数据集可能需要耗费大量的时间去处理。在许多场景下,可以通过分区的方法减少每一次扫描总数据量,这种做法可以显著地改善性能。

数据会依照单个或多个列进行分区,通常按照时间、地域或者是商业维度进行分区。比如vido表,分区的依据可以是电影的种类和评级,另外,按照拍摄时间划分可能会得到更一致的结果。为了达到性能表现的一致性,对不同列的划分应该让数据尽可能均匀分布。较好的情况下,分区的划分条件总是能够对应where语句的部分查询条件。

Hive的分区使用HDFS的子目录功能实现。每一个子目录包含了分区对应的列名和每一列的值。但是由于HDFS并不支持大量的子目录,这也给分区的使用带来了限制。我们有必要对表中的分区数量进行预估,从而避免因为分区数量过大带来一系列问题。

Hive查询通常使用分区的列作为查询条件。这样的做法可以指定MapReduce任务在HDFS中指定的子目录下完成扫描的工作。HDFS的文件目录结构可以像索引一样高效利用。
回复 支持 反对

使用道具 举报

论坛徽章:
9
Oracle研习者初级
日期:2013-03-16 21:09:06Oracle研习者初级
日期:2013-04-07 11:39:27Oracle研习者初级
日期:2013-04-18 13:19:15Oracle研习者高级
日期:2013-08-25 14:26:25nosql徽章
日期:2013-11-12 16:18:18Oracle研习者中级
日期:2014-09-19 14:31:38比特币徽章
日期:2014-11-06 14:54:26Oracle研习者高级
日期:2018-05-10 16:26:15Hive徽章
日期:2018-05-17 15:59:03
 楼主| 发表于 2018-4-8 23:59 | 显示全部楼层
分桶(桶表)
简介

桶是通过对指定列进行哈希计算来实现的,通过哈希值将一个列名下的数据切分为一组桶,并使每个桶对应于该列名下的一个存储文件。
回复 支持 反对

使用道具 举报

论坛徽章:
9
Oracle研习者初级
日期:2013-03-16 21:09:06Oracle研习者初级
日期:2013-04-07 11:39:27Oracle研习者初级
日期:2013-04-18 13:19:15Oracle研习者高级
日期:2013-08-25 14:26:25nosql徽章
日期:2013-11-12 16:18:18Oracle研习者中级
日期:2014-09-19 14:31:38比特币徽章
日期:2014-11-06 14:54:26Oracle研习者高级
日期:2018-05-10 16:26:15Hive徽章
日期:2018-05-17 15:59:03
 楼主| 发表于 2018-4-8 23:59 | 显示全部楼层
为什么要分桶?

在分区数量过于庞大以至于可能导致文件系统崩溃时,我们就需要使用分桶来解决问题了。

分区中的数据可以被进一步拆分成桶,不同于分区对列直接进行拆分,桶往往使用列的哈希值对数据打散,并分发到各个不同的桶中从而完成数据的分桶过程。

注意,hive使用对分桶所用的值进行hash,并用hash结果除以桶的个数做取余运算的方式来分桶,保证了每个桶中都有数据,但每个桶中的数据条数不一定相等。

哈希函数的选择依赖于桶操作所针对的列的数据类型。除了数据采样,桶操作也可以用来实现高效的Map端连接操作。

记住,在数据量足够大的情况下,分桶比分区,更高的查询效率。
回复 支持 反对

使用道具 举报

论坛徽章:
9
Oracle研习者初级
日期:2013-03-16 21:09:06Oracle研习者初级
日期:2013-04-07 11:39:27Oracle研习者初级
日期:2013-04-18 13:19:15Oracle研习者高级
日期:2013-08-25 14:26:25nosql徽章
日期:2013-11-12 16:18:18Oracle研习者中级
日期:2014-09-19 14:31:38比特币徽章
日期:2014-11-06 14:54:26Oracle研习者高级
日期:2018-05-10 16:26:15Hive徽章
日期:2018-05-17 15:59:03
 楼主| 发表于 2018-4-8 23:59 | 显示全部楼层
总结
索引和分区较大的区别就是索引不分割数据库,分区分割数据库。

索引其实就是拿额外的存储空间换查询时间,但分区已经将整个大数据库按照分区列拆分成多个小数据库了。



分区和分桶较大的区别就是分桶随机分割数据库,分区是非随机分割数据库。

因为分桶是按照列的哈希函数进行分割的,相对比较平均;而分区是按照列的值来进行分割的,容易造成数据倾斜。

其次两者的另一个区别就是分桶是对应不同的文件(细粒度),分区是对应不同的文件夹(粗粒度)。

注意:普通表(外部表、内部表)、分区表这三个都是对应HDFS上的目录,桶表对应是目录里的文件



推荐大家学习的时候HIVE、HDFS、MYSQL三者结合一起看,更容易理解其中的原理。
回复 支持 反对

使用道具 举报

论坛徽章:
9
Oracle研习者初级
日期:2013-03-16 21:09:06Oracle研习者初级
日期:2013-04-07 11:39:27Oracle研习者初级
日期:2013-04-18 13:19:15Oracle研习者高级
日期:2013-08-25 14:26:25nosql徽章
日期:2013-11-12 16:18:18Oracle研习者中级
日期:2014-09-19 14:31:38比特币徽章
日期:2014-11-06 14:54:26Oracle研习者高级
日期:2018-05-10 16:26:15Hive徽章
日期:2018-05-17 15:59:03
 楼主| 发表于 2018-4-8 23:59 | 显示全部楼层
回复 支持 反对

使用道具 举报

新浪微博达人勋 plume  实名认证
论坛徽章:
26
Oracle研习者高级
日期:2013-08-25 14:24:54Julia徽章
日期:2017-12-25 17:39:24Java徽章
日期:2018-01-04 17:15:14Hive徽章
日期:2018-05-17 15:59:03spark徽章
日期:2018-06-14 15:36:26大数据课程徽章
日期:2018-08-06 14:27:18机器学习徽章
日期:2018-11-16 14:11:57python徽章
日期:2018-11-29 14:52:29Java徽章
日期:2018-12-13 15:57:02python徽章
日期:2018-12-20 15:14:57python徽章
日期:2018-12-27 15:35:13python徽章
日期:2019-04-04 17:06:24
发表于 2018-4-13 14:33 | 显示全部楼层
谢谢楼主分享,学习了。
回复 支持 反对

使用道具 举报

论坛徽章:
9
Hadoop研习者初级
日期:2017-12-28 17:09:25Java徽章
日期:2018-01-04 17:15:14数据陷阱解读徽章
日期:2018-03-01 16:41:57计算徽章
日期:2018-03-19 15:04:30Kafka徽章
日期:2018-03-23 10:45:46大型分布式徽章
日期:2018-03-29 16:06:23spark徽章
日期:2018-04-20 15:29:14spark徽章
日期:2018-04-26 15:29:14spark徽章
日期:2018-05-03 15:46:21
发表于 2018-4-15 21:19 | 显示全部楼层
谢谢楼主分享 谢谢楼主分享 谢谢楼主分享
回复 支持 反对

使用道具 举报

新浪微博达人勋 bxy5511  未实名认证
论坛徽章:
28
R研习者中级
日期:2014-09-19 14:18:44Java徽章
日期:2016-08-18 11:33:28python徽章
日期:2016-11-03 17:46:49python徽章
日期:2017-12-07 16:06:27python徽章
日期:2018-01-11 17:40:18机器学习徽章
日期:2018-02-01 17:45:33机器学习徽章
日期:2018-03-29 16:05:00pyspark徽章
日期:2018-04-08 16:26:32Tensorflow徽章
日期:2018-04-20 15:27:10Hive徽章
日期:2018-05-17 15:59:03spark徽章
日期:2018-06-14 15:36:26spark徽章
日期:2018-08-24 10:52:51
发表于 2018-4-19 14:53 | 显示全部楼层
分桶是不是一定在分区后面啊?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

 

GMT+8, 2019-8-20 02:29 , Processed in 0.142846 second(s), 51 queries .