Hive分区表count(*)不起mapreduce的真相

本文探讨了Hive中执行count(*)操作时的性能表现差异,并深入解析了Hive通过FetchTask实现简单查询优化的机制。针对分区表,文章详细介绍了如何利用元数据中的分区信息来快速获取count(*)结果。

问题背景:
在对Hive求count(*)时,发现有些表会启mapreduce计算、返回 结果,比较耗时,有的表1秒之内返回结果
刚开始以为刚刚执行过一次count()后会对结果进行缓存,不用再去跑mapreduce,但经进一步实验发现大多数表每次执行count()操作都会跑mapreduce,于是猜测的结论不成立。
后在必应查找原因,大部分的结果都指向了:‘hive从1.0开始采用Fetch Task, 对于简单查询的自动优化’
具体内容可以参考:http://blog.javachen.com/2014/06/09/fetchtask-in-hive.html

查找思路:
经过了解Fetch Task发现,它对简单查询会直接读取文件,但是不适用于聚合操作,继续查找原因,发现有人提到分区表,是有把分区的信息写入元数据,于是查看hive的mysql元数据表。

问题解决:
在hive的元数据库‘hive’库中有8张跟分区表有关的表,其中partitions保存有分区表的源表、分区id等信息,而在另一张表‘partition_params’表中存有 part_id 和对应的参数值(其中包括行数,行数据大小,总大小等)
答案就很明了了,分区表的count(*)是从元数据表中所取,而并非从所有节点上 map 然后reduce。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值