2016-07-18 5 views
1

は、我々のようにテーブルを分割していると言う: - 日(日保存されます(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 

をしかし、これはパーティションスキームを利用するつもりはない場合、それが起こっています性能を妨げる。

+1

ランに行くことによってレコードを取得することができます....'を実行し、実行計画を検査します。これは、Hiveオプティマイザがどのように「パーティションプルーニング」を行うかについての手がかりを与えるはずです。 –

答えて

0

はい。ハイブパーティショニングは階層的です。 以下のクエリを使用して、テーブルのパーティションを印刷するだけでこれを確認できます。

show partitions MyTable; 

出力:あなたのシナリオでは

year=2016/month=5/day=5/hour=5/combination_id=2016050505 
year=2016/month=5/day=5/hour=6/combination_id=2016050506 
year=2016/month=5/day=5/hour=7/combination_id=2016050507 

、あなたが照会のために使用されていない場合は、パーティション列としてcombination_idを指定する必要はありません。

複数の列によってパーティション操作をグループ化して、パフォーマンスに役立ちます

Year, month, day, hour columns 

または

combination_id only 

のいずれかによって分割することができます。

年の '3月'の月(2016 & 2015)のcol1の最大値を検索するとします。

これは、簡単に選択説明 `特定の「年」のパーティション(= 2015分の2016年)と月のパーティション(月= 3)

+0

したがって、year、month、day、hour、combination_idの順にパーティションを作成し、次にpartition_idのみを照会している状況では、年、月、日、時にクエリを実行するとパフォーマンスが低下するその順序で)右か? – Dhiraj

+1

あなたの場合、もしあなたがcombination_idを知っているなら、あなたは年、月、日、時を知っています。ですから、年、月などの特定の列をクエリする方が良いでしょう。 – Munesh

関連する問題