昨天跑了一个Hive查询发现启动的MAP数远远多于预期,很奇怪;查询可以简单抽象如下:
比如有一个表t的分区键dt string;查询select count(*) from t where dt=20130926;
是哪里出了问题呢?首先看一下执行计划果然发现问题了:
首先出现了:
expr: (dt = 2.0130926E7)
type: boolean
其次partition values是dt 和__HIVE_DEFAULT_PARTITION__
应该发生了类似隐式转换的事情吧?修改成dt=’20130926’再看正确了.
因为隐式转换而无法使用索引的情况在RDBMS比较常见,但是这个如果是隐式转换也说不通,因为只是多扫描了一个分区而不是全部分区,带着这样的疑问看源码:得到的结论就是Hive的分区键列和值都必须是String类型,如果不是就可能会Hit到bug 4878(pruneBySequentialScan),不知道为什么CDH4.2没有merge这个patch.
Update:这个Bug已经在Hive 0.12被fixed掉了
本文转自MIKE老毕 51CTO博客,原文链接:http://blog.51cto.com/boylook/1302073,如需转载请自行联系原作者