0

2 つのテーブル と が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 条件を述語フィルターとして使用するかどうかを決定する基準はどれですか?

4

0 に答える 0