昨天跑了一个Hive查询发现启动的MAP数远远多于预期,很奇怪;查询可以简单抽象如下:

比如有一个表t的分区键dt string;查询select count(*) from t where dt=20130926;

是哪里出了问题呢?首先看一下执行计划果然发现问题了:

首先出现了:

expr: (dt = 2.0130926E7)

type: boolean

其次partition valuesdt __HIVE_DEFAULT_PARTITION__

应该发生了类似隐式转换的事情吧?修改成dt=’20130926’再看正确了.

因为隐式转换而无法使用索引的情况在RDBMS比较常见,但是这个如果是隐式转换也说不通,因为只是多扫描了一个分区而不是全部分区,带着这样的疑问看源码:得到的结论就是Hive的分区键列和值都必须是String类型,如果不是就可能会Hitbug 4878(pruneBySequentialScan),不知道为什么CDH4.2没有merge这个patch.

Update:这个Bug已经在Hive 0.12被fixed掉了,https://issues.apache.org/jira/browse/HIVE-4878