は、我々のようにテーブルを分割していると言う: - 日(日保存されます(7例)今、明らかに今年は(例えば2016)ストア年の値に起こっている、月は月のva.ueを格納するハイブパーティショニングは性質上階層化されていますか?
CREATE EXTERNAL TABLE MyTable (
col1 string,
col2 string,
col3 string
)
PARTITIONED BY(year INT, month INT, day INT, hour INT, combination_id BIGINT);
18)、時間は24時間形式で時間値を格納します(たとえば13)。そして、combination_idは、すべてのこれらの値のパッドの組み合わせ(1桁の値の場合は左に0をつける)です。したがって、この場合には、たとえば組み合わせIDが2016071813.
だから我々は(クエリAそれを呼び出すことができます)クエリを解雇されています -
select * from mytable where combination_id = 2016071813
今ハイブは、そのcombination_idを知らない、実際の組み合わせです年、月、日、時。だからこのクエリは、分割の適切な利点を取られませんか?言い換えれば
、私は別のクエリを持っている場合は、クエリBそれを呼び出すが、これは、クエリAよりも最適であるかは差がないだろう - ?
select * from mytable where year=2016 and month=7 and day=18 and hour=13
ハイブのパーティションスキームは、実際にある場合本質的に階層的である場合、クエリBはパフォーマンスの観点からより良くなるはずです。実際には、パフォーマンスの向上に貢献していない場合は、パーティショニングスキームからcombination_idをすべて削除するかどうかを決定したいと考えています。
組み合わせのIDを使用するための唯一の本当の利点は、選択中 BETWEEN演算子を使用できるようにすることです: -
select * from mytable where combination_id between 2016071813 and 2016071823
をしかし、これはパーティションスキームを利用するつもりはない場合、それが起こっています性能を妨げる。
ランに行くことによってレコードを取得することができます....'を実行し、実行計画を検査します。これは、Hiveオプティマイザがどのように「パーティションプルーニング」を行うかについての手がかりを与えるはずです。 –