2016-07-18 13 views
1

Sagen wir eine Tabelle haben partitioniert wie: -Ist die Hive-Partitionierung hierarchisch?

CREATE EXTERNAL TABLE MyTable (
col1 string, 
col2 string, 
col3 string 
) 
PARTITIONED BY(year INT, month INT, day INT, hour INT, combination_id BIGINT); 

Jetzt offensichtlich Jahr zum Speichern Jahr Wert (zB 2016) geht, wird der Monat Monat va.ue speichern (zB 7) wird der Tag Tage speichern (zB 18) und Stunde speichert den Stundenwert im 24 Stunden Format (zB 13). Und combination_id wird eine Kombination aus gepolsterten (wenn ein einstelliger Wert pad es mit 0 auf der linken Seite) Werte für alle diese sein. Also in diesem Fall zum Beispiel die Kombination ID ist 2016071813.

So feuern wir query (nennen wir es Abfrage A): -

select * from mytable where combination_id = 2016071813 

Jetzt Hive wissen nicht, dass combination_id ist eigentlich Kombination aus Jahr, Monat, Tag und Stunde. Wird diese Abfrage die Partitionierung nicht richtig ausnutzen?

Mit anderen Worten, wenn ich eine andere Frage haben, rufen Sie es Abfrage B, wird dies optimalere als Abfrage A oder es gibt keinen Unterschied: -

select * from mytable where year=2016 and month=7 and day=18 and hour=13 

Wenn Schema Hive Partitionierung ist wirklich hierarchisch in der Natur dann Abfrage B sollte besser sein, aus Sicht der Leistung ist, was ich denke. Eigentlich möchte ich entscheiden, ob ich combination_id überhaupt vom Partitionierungsschema loswerde, wenn es überhaupt nicht zu einer besseren Performance beiträgt.

Der einzige wirkliche Vorteil für Kombinations-ID mit in der Lage seine ZWISCHEN Operator in ausgewählten zu verwenden: -

select * from mytable where combination_id between 2016071813 and 2016071823 

Aber wenn dieser Vorteil geht zu nehmen ist nicht von Partitionierungsschema, es wird zu behindern die Leistung.

+1

Run 'erklären gehen ....'für beide Abfragen und überprüfen Sie den Ausführungsplan. Das sollte Ihnen einige Hinweise darüber geben, wie der Hive-Optimizer "Partition-Beschneidung" durchführt. –

Antwort

0

Ja. Die Hive-Partitionierung ist hierarchisch. Sie können dies einfach überprüfen, indem Sie die Partitionen der Tabelle mit der folgenden Abfrage drucken.

show partitions MyTable; 

Ausgang:

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 

In Ihrem Szenario, müssen Sie nicht als Trennsäule combination_id angeben, wenn Sie nicht für die Abfrage verwenden.

können Sie partitionieren entweder durch

Year, month, day, hour columns 

oder

combination_id only 

Partitionierung durch mehrere Spalten hilft bei der Leistung in Betrieb zu gruppieren.

Angenommen, Sie möchten das Maximum eines col1 für 'März' Monat der Jahre finden (2016 & 2015).

Es kann leicht die Datensätze holen, indem wählen, um die spezifischen ‚Jahr‘ Partition (Jahr = 2016/2015) und Monat Partition (Monat = 3)

+0

Also in einer Situation, in der Sie Partition auf Jahr, Monat, Tag, Stunde, Kombination_ID in dieser Reihenfolge haben und dann nur auf partition_id abfragen - es bedeutet, dass die Leistung im Vergleich zu Abfrage von Jahr, Monat, Tag, Stunde (in dieser Reihenfolge) richtig? – Dhiraj

+1

Rechts. In Ihrem Fall kennen Sie das Jahr, den Monat, den Tag und die Stunde, wenn Sie die combination_id kennen. Es ist also besser, die spezifischen Spalten von Jahr, Monat, .. mit Partitionierung für diese Spalten abzufragen – Munesh

Verwandte Themen