HIVE(不)何时在分区上使用WHERE子句作为谓词过滤器

时间:2016-12-21 14:57:35

标签: hive predicate partition tez

我有两个表tbl_atbl_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 where条件是否用作谓词过滤器?

0 个答案:

没有答案