Verbesserung Ihrer Hive Abfragen mit Indizes

Erstellen eines Indexes ist gängige Praxis, mit relationalen Datenbanken, wenn Sie Zugriff auf eine Spalte oder eine Gruppe von Spalten in der Datenbank zu beschleunigen wollen. Ohne Index hat das Datenbanksystem alle Zeilen in der Tabelle zu lesen, die Daten, die Sie ausgewählt haben, zu finden. Indizes werden sogar noch wichtiger, wenn die Tabellen extrem groß werden, und wie Sie jetzt zweifellos wissen, Hive lebt von großen Tabellen.

Wie man erwarten würde, unterstützt Hive Indexerstellung auf Tabellen, obwohl seine Funktionalität noch etwas unreif ist. Allerdings ist die Hive-Community aktiv ist, und die Indizierung wird schließlich reifen. Auch mit seinen derzeitigen Grenzen, Indexierung bietet einen Ansatz Hive Abfragen mit wenig Aufwand zu beschleunigen.

Sie können Hive Abfragen in mindestens fünf Möglichkeiten optimieren: Erstens, mit ein wenig Forschung, können Sie oft beschleunigen Ihre verbindet durch bestimmte Optimierungstechniken nutzen, wie sie auf die beschriebene Hive Wiki. Zweitens spaltenorientierte Speicheroptionen kann sehr hilfreich sein. Denken Sie daran, dass die ORC-Dateiformat als von Hive 0.11 neu ist.

Drittens können Sie Tabellen partitionieren. Viertens hat die Hive-Community Indizierung zur Verfügung gestellt. Schließlich, vergessen Sie nicht die hive.exec.mode.local.auto Konfigurationsvariable.

Im Folgenden sind die Schritte notwendig, um Index der FlightInfo2008 Tabelle. Diese extrem große Tabelle hat Millionen von Zeilen, so macht es ein guter Kandidat für einen Index oder zwei.

(A) CREATE INDEX f08_index AUF TABELLE flightinfo2008 (Origin) AS "COMPACT" mit aufgeschobener REBUILD- (B) INDEX ALTER f08_index ON flightinfo2008 REBUILD- (C) hive (Flugdaten)> SHOW INDEXES ON FlightInfo2008-OKf08indexflightinfo2008 Herkunft flightdata__flightinfo2008_f08index__ compactTime genommen: 0.079 Sekunden, Fetched: 1 Zeile (n) (D) hive (Flugdaten)> DESCRIBE flightdata__flightinfo2008_f08index __- OKorigin Zeichenfolge None_bucketname string_offsetsarrayBenötigte Zeit: 0,112 Sekunden, Fetched: 3 Zeile (n) (E) hive (Flugdaten)> SELECT Herkunft, COUNT (1) FROM flightinfo2008 WHERE Herkunft = 'SYR' GROUP BY Origin-SYR 12032Time genommen: 17,34 Sekunden, Fetched: 1 Zeile (n) (F) hive (Flugdaten)> SELECT Herkunft, Größe ( `_offsets`) FROM flightdata__flightinfo2008_f08index__ WHERE Herkunft = 'SYR'-SYR 12032Time genommen: 8,347 Sekunden, Fetched: 1 Zeile (n) (G) hive (Flugdaten )> DESCRIBE flightdata__flightinfo2008_f08index __- OKorigin Zeichenfolge None_bucketname string_offsetsarrayBenötigte Zeit: 0.12 Sekunden Fetched: 3 Zeile (n)

Schritt (A) erzeugt den Index mit dem 'KOMPAKT"Index-Handler auf die Herkunft Spalte. Hive bietet auch eine Bitmap-Index-Handler als der 0,8-Release, die für die Erstellung von Indizes für Spalten mit wenigen eindeutigen Werten bestimmt ist.

In Schritt (A) die Schlüsselwörter Mit aufgeschobener REBUILD Hive anweist, zuerst ein leeres Index- Schritt (B) zu erstellen, in dem Sie tatsächlich den Index mit dem Bau ALTER INDEX ... REBUILD Befehl. Latente Index baut in Workflows sehr nützlich sein kann, wenn ein Prozess auf den Tabellen und Indizes erstellt, eine andere lädt die Daten und erstellt die Indizes und einem abschließenden Prozess führt Analysedaten.

Hive bietet keine automatische Indexwartung, so müssen Sie den Index neu erstellen, wenn Sie Daten in die Tabelle zu überschreiben oder anhängen. Auch Hive Indizes unterstützen Tabellenpartitionen, so dass eine neu erstellen können auf eine Partition beschränkt werden. Schritt (C) zeigt, wie Sie können die Indizes gegen eine bestimmte Tabelle erstellt Liste oder zeigen.

Schritt (D) stellt einen wichtigen Punkt in Bezug auf Hive Indizes: Hive-Indizes werden als Tabellen implementiert. Aus diesem Grund müssen Sie zuerst die Indextabelle erstellen und dann bauen die Tabelle zu füllen. Daher können Sie Indizes in mindestens zwei Arten verwenden:

  • Zählen Sie auf dem System automatisch Indizes verwenden, die Sie erstellen.

  • Rewrite einige Abfragen die neue Indextabelle zu nutzen.

Die automatische Verwendung von Indizes schreitet voran, aber dieser Aspekt ist ein work in progress. Die Konzentration auf die zweite Option in Schritt (E) Sie schreiben eine Abfrage, wie viele Flüge im Jahr 2008 die Syracuse Flughafen verlassen, um zu bestimmen versucht, diese Informationen zu erhalten, nutzen Sie die GRAF Aggregatfunktion.

Sie können sehen, dass Hive nahm 17,32 Sekunden auf der virtuellen Maschine zu berichten, dass 12.032 Flüge von Syracuse, New York entstanden.

In Schritt (F), nutzen Sie die neue Indextabelle und verwenden Sie die GRÖSSE Funktion statt. Schritt (F) macht mehr Sinn, wenn Sie studieren Schritt (D): Schritt (D) zeigt Ihnen, was eine Indextabelle aussieht, in der Datensätze jeweils die Spalte halten _bucketname, das ist die Position der Daten im Hive Lager (/ Home / BiAdmin / Hive / Lager, in diesem Fall), und ein _offsets Array, das der Index in die Tabelle (FlightInfo2008) in diesem Fall.

So, jetzt die Abfrage in Schritt (F) macht Sinn. Alle Hive zu tun hat, ist das finden SYR Herkunft (für Syrakus) in der flightdata__flightinfo2008_f08index__ Tisch und dann zählen die Zeilen in der _offsets' Array die Anzahl der Flüge zu bekommen - eine einfache, aber elegante Möglichkeit, die Leistung (8,347 Sekunden in Schritt (F) im Vergleich zu 17,34 verdoppeln in Schritt (E)) der ursprünglichen Abfrage.

Menü