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

来源:互联网 发布:剑雨江湖灵骑进阶数据 编辑:程序博客网 时间:2024/05/22 01:40

问题背景:
在对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。

原创粉丝点击