我有两个表,tbl_a
并且tbl_b
都格式化为 ORC,并在列上分区dt
。一个表使用分区格式%Y%m%d%H%M
,而另一个表使用%Y%m%d
.
当我查看 Hive 1.2.1.2.4(使用 TEZ 0.7.0.2.4)中一个简单的 SELECT + WHERE 语句的执行计划时,我只看到为 设置的谓词过滤器tbl_a
,但看不到另一个tbl_b
。这意味着,tbl_b
将执行全表扫描,而不仅仅是对所需分区的扫描。两个查询的分区都存在并包含数据。
hive> EXPLAIN SELECT * FROM tbl_a WHERE dt='1001010600';
OK
Plan not optimized by CBO.
Stage-0
Fetch Operator
limit:-1
Select Operator [SEL_2]
outputColumnNames:["_col0","_col1","_col2","_col3"]
Filter Operator [FIL_4]
predicate:(dt = '1001010600') (type: boolean)
TableScan [TS_0]
alias:tbl_a
Time taken: 0.866 seconds, Fetched: 12 row(s)
hive> EXPLAIN SELECT * FROM tbl_b WHERE dt='161001';
OK
Plan not optimized by CBO.
Stage-0
Fetch Operator
limit:-1
Select Operator [SEL_2]
outputColumnNames:["_col0","_col1","_col2","_col3"]
TableScan [TS_0]
alias:tbl_b
Time taken: 0.904 seconds, Fetched: 10 row(s)
这种行为对我来说不是很清楚。哪个条件决定是否将 where 条件用作谓词过滤器?