Hive-Ansicht und -Indexierung: Erstellen mit Beispielen

⚡ Intelligente Zusammenfassung

Views in Hive sind gespeicherte Abfragen, die sich wie schreibgeschützte Tabellen verhalten, während Indizes Zeiger auf eine Spalte sind, die die Suchvorgänge beschleunigen. Beide werden mit kurzen HiveQL-Anweisungen erstellt, die hier gezeigt werden.

  • 👁️ Die Ansicht ist logisch: Eine Ansicht speichert nur ihre SELECT-Anweisung im Metastore, sodass sie keinen eigenen Speicherplatz belegt.
  • 🔒 Schreibgeschützt (laut Design): Eine View kann nicht Ziel von LOAD, INSERT oder ALTER sein, da Hive sie bei jeder Abfrage neu auswertet.
  • 📍 Indexpunkte auf Daten: Ein Index ist ein Zeiger auf einen Spaltenwert, der es Hive ermöglicht, nur einen Teil einer Datei anstatt der gesamten Tabelle zu lesen.
  • 🗂️ Zwei Betreuer: Kompakte Indizierung eignet sich für Spalten mit hoher Kardinalität, Bitmap-Indizierung eignet sich für Spalten mit wenigen unterschiedlichen Werten.
  • 🔄 Manuelle Neuinstallation: Ein Index wird niemals automatisch aktualisiert, daher muss ALTER INDEX REBUILD nach Änderungen an der Basistabelle ausgeführt werden.
  • 🚫 In Hive 3.0 entfernt: Mit HIVE-18448 wurde die Indizierung eingestellt und durch materialisierte Sichten, ORC- oder Parquet-Speicherung und Partitionierung ersetzt.

Views und Indizes in Hive anhand von Beispielen erklärt.

Was ist eine Ansicht?

Views ähneln Tabellen und werden bedarfsorientiert generiert. Eine View ist ein rein logisches Objekt ohne eigenen Speicher: Hive speichert lediglich den Abfragetext im Metastore und wertet ihn bei jedem Zugriff auf die View aus.

  • Wir können alle Ergebnissatzdaten als Ansicht in Hive speichern
  • Die Verwendung ähnelt den Ansichten, die in verwendet werden SQL
  • Eine Ansicht ist schreibgeschützt und kann daher nicht Ziel einer LOAD-, INSERT- oder ALTER-Anweisung sein, die Daten schreibt.

Ansicht erstellen:

Syntax:

Create VIEW <VIEWNAME> AS SELECT

Die vollständig dokumentierte Form akzeptiert auch eine IF NOT EXISTS-Klausel und eine optionale Spaltenliste, was nützlich ist, wenn die SELECT-Liste Ausdrücke anstelle von einfachen Spaltennamen enthält.

Ejemplo:

Hive>Create VIEW Sample_View AS SELECT * FROM employees WHERE salary>25000

In diesem Beispiel erstellen wir die Ansicht Sample_View, die alle Zeilenwerte anzeigt, deren Gehaltsfeld größer als 25000 ist. Der Filter befindet sich innerhalb der Ansicht, sodass jede Abfrage, die Daten aus Sample_View auswählt, nur diese Zeilen sieht.

Was ist Index?

Indizes sind Verweise auf einen bestimmten Spaltennamen einer Tabelle. Ziel eines Indexes ist die Verbesserung der Suchgeschwindigkeit: Ohne Index würde eine Abfrage mit einem Prädikat wie beispielsweise WHERE tab1.col1 = 10 Lädt die gesamte Tabelle oder Partition und verarbeitet jede Zeile, während ein Index auf col1 es Hive ermöglicht, nur einen Teil der Datei zu lesen.

  • Der Benutzer muss den Index manuell definieren
  • Wenn wir einen Index erstellen, bedeutet dies, dass wir einen Zeiger auf einen bestimmten Spaltennamen der Tabelle erstellen.
  • Alle Änderungen, die an einer Spalte in der Tabelle vorgenommen werden, werden mithilfe des Indexwerts gespeichert, der für den Spaltennamen erstellt wurde.

Diese Beschleunigung hat ihren Preis. Der Aufbau des Index erfordert zusätzliche Rechenleistung, und der Index selbst belegt Speicherplatz, der zusammen mit der Tabelle verwaltet werden muss.

Syntax:

Create INDEX <INDEX_NAME> ON TABLE <TABLE_NAME(column names)>

Ejemplo:

Create INDEX sample_Index ON TABLE guruhive_internaltable(id)

Hier erstellen wir einen Index für die Spalte „id“ in der Tabelle „guruhive_internaltable“. Beachten Sie, dass eine vollständige Anweisung in einer Version, die Indizierung noch unterstützt, auch eine Index-Handler-Klausel benötigt, die im nächsten Abschnitt ausführlich erläutert wird.

Unterschied zwischen Ansicht und Index in Hive

Sichten und Indizes werden oft gemeinsam eingeführt, da beide auf einer bestehenden Tabelle aufbauen, lösen aber unterschiedliche Probleme. Eine Sicht ändert, was eine Abfrage sieht, während ein Index die Geschwindigkeit erhöht, mit der Hive die Daten findet. Die folgende Tabelle vergleicht sie.

Aspekt Ansehen Index
Was es speichert Nur die SELECT-Anweisung im Metastore Eine separate Indextabelle, die Zeiger auf die Daten enthält.
Zweck Vereinfachen oder beschränken Sie die Rückgabewerte einer Abfrage. Verringern Sie die Menge der für ein Prädikat gescannten Daten.
Festplattenkosten Keine Präsentation Zusätzlicher Speicherplatz und ein Neuaufbau nach Datenänderungen
Schreibzugriff Nur-Lese- Wird nicht direkt abgefragt; der Optimierer verwendet es.
Aktueller Status Voll unterstützt In Hive 3.0 entfernt.

In der Praxis wird eine Ansicht zur besseren Lesbarkeit und Zugriffskontrolle erstellt, während ein Index ausschließlich zur Leistungsoptimierung für eine bestimmte Spalte erstellt wird.

Indextypen in Hive mit Syntax

Bis einschließlich Hive 2.x wurden zwei Index-Handler ausgeliefert, wobei der Handler in der obligatorischen AS-Klausel angegeben wird. Kompakte Indizierung wurde mit Hive 0.7.0 und Bitmap-Indizierung mit Hive 0.8.0 eingeführt.

  • Kompaktindex: Speichert den Wert zusammen mit der Adresse des HDFS-Blocks, der ihn enthält, anstatt die Position jedes einzelnen Vorkommens zu protokollieren. Dies eignet sich für Spalten mit vielen unterschiedlichen Werten.
  • Bitmap-Index: speichert eine Bitmap pro eindeutigem Wert, was die übliche Vorgehensweise für eine Spalte mit nur wenigen eindeutigen Werten ist, wie z. B. ein Status- oder Geschlechtsflag.

Es wird ein kompakter Index erstellt, aufgelistet und wie folgt gelöscht:

CREATE INDEX table01_index ON TABLE table01 (column2) AS 'COMPACT';
SHOW INDEX ON table01;
DROP INDEX table01_index ON table01;

Die Option WITH DEFERRED REBUILD registriert den Index, ohne ihn zu füllen, sodass der Build separat mit ALTER INDEX geplant werden kann. Ein Bitmap-Index wird auf die gleiche Weise erstellt, jedoch mit einem anderen Handler-Namen:

CREATE INDEX table03_index ON TABLE table03 (column4) AS 'BITMAP' WITH DEFERRED REBUILD;
ALTER INDEX table03_index ON table03 REBUILD;
SHOW FORMATTED INDEX ON table03;
DROP INDEX table03_index ON table03;

Ein Index wird nicht automatisch aktualisiert. Immer wenn die Basistabelle neue Daten erhält, muss ALTER INDEX … REBUILD erneut ausgeführt werden, und bei einer partitionierten Tabelle kann die Aktualisierung auf eine einzelne Partition beschränkt werden.

Warum die Indizierung in Hive 3.0 entfernt wurde

Die Indizierung wurde in Hive Version 3.0 (HIVE-18448) entfernt. Daher existieren die Befehle CREATE INDEX, SHOW INDEX und DROP INDEX in aktuellen Clustern nicht mehr. Der Aufwand für einen erneuten Aufbau dieser Funktion lohnte sich nach der Einführung der spaltenorientierten Speicherung und des kostenbasierten Optimierers nur noch selten. Drei Alternativen decken denselben Bereich ab.

  • Materialisierte Ansichten: eingeführt in Hive 3.0.0, ein materialisierte Ansicht speichert das vorab berechnete Ergebnis einer Abfrage, und der Optimierer schreibt eingehende Abfragen automatisch anhand dieses Ergebnisses um.
  • Spaltenorientierte Dateiformate: ORC und Parquet verfügen über eigene, leichtgewichtige Indizes und Min/Max-Statistiken, sodass der Leser ganze Stripes, Blöcke oder Dateien ohne benutzerdefinierten Index überspringen kann.
  • Partitionen und Buckets: Partitionierung und Bucketing Die Daten werden auf Verzeichnis- und Dateiebene bereinigt, wodurch in der Regel weitaus mehr Daten entfernt werden als durch einen Index.

Auf Hive 2.x ist ein Index zwar noch gültig, für neue Projekte eignen sich jedoch besser eine der oben genannten Optionen.

Häufig gestellte Fragen

Mit DROP VIEW view_name wird die Ansicht gelöscht, und mit ALTER VIEW view_name RENAME TO new_name wird sie umbenannt. Da eine Ansicht keine Daten enthält, wird sie gelöscht.ping Die Basistabelle wird nie verändert; lediglich der Eintrag im Metastore verschwindet.

Eine materialisierte Sicht speichert das vorab berechnete Abfrageergebnis als reale Daten, benötigt daher Speicherplatz und erfordert einen REBUILD-Vorgang. Eine normale Sicht speichert lediglich den Abfragetext und wird bei jedem Zugriff neu berechnet.

Nein. Der Metastore speichert lediglich die SELECT-Anweisung und die Liste der aufgelösten Spalten. Jede Referenz führt die zugrundeliegende Abfrage erneut aus, weshalb eine Ansicht über einen langsamen Join langsam bleibt.

In Hive 0.12.0 und früheren Versionen wurde bei CREATE INDEX und DROP INDEX zwischen Groß- und Kleinschreibung unterschieden, während ALTER INDEX Kleinbuchstaben erforderte. Hive 0.13.0 hat die Groß- und Kleinschreibung bei Indexnamen für alle Anweisungen deaktiviert.

Ja, auf jedem modernen Cluster. Partition Pruning entfernt ganze Verzeichnisse, bevor der Scan beginnt, und Bucketing beschränkt einen Join oder eine Stichprobe auf bestimmte Dateien, was in der Regel besser ist als das, was eine Indextabelle leisten könnte.

Tools für maschinelles Lernen analysieren Abfrageprotokolle, ordnen Prädikatspalten nach Selektivität und Häufigkeit und geben Hinweise darauf, wo sich eine materialisierte Sicht oder ein Partitionierungsschema lohnen würde. Validieren Sie jeden Vorschlag anhand eines EXPLAIN-Plans, bevor Sie ihn anwenden.

Es erzeugt zuverlässig CREATE VIEW-Anweisungen aus einem kurzen Kommentar. Beachten Sie versionsspezifische Unterschiede, da es weiterhin CREATE INDEX-Syntax ausgibt, die von einem Hive-Cluster der Version 3.0 oder höher direkt abgelehnt wird.

Der Index ist eine separate Tabelle mit Zeigern, die von Hive bei Änderungen der Basistabelle nie aktualisiert wird. Ohne einen Neuaufbau veralten die Zeiger, sodass der Optimierer den Index entweder überspringt oder veraltete Treffer zurückgibt.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: