Hive-Abfragebeispiele: ORDER BY, GROUP BY & Cluster By

⚡ Intelligente Zusammenfassung

Hive-Abfragen verwenden ORDER BY-, GROUP BY-, SORT BY-, CLUSTER BY- und DISTRIBUTE BY-Klauseln, um Zeilen zu sortieren, zu gruppieren und auf Reducer zu verteilen. Jede Klausel wird hier anhand einer einzelnen Beispiel-Mitarbeitertabelle demonstriert.

  • 🧱 Zuerst die Beispieltabelle: employees_guru wird mit sechs Spalten erstellt und vor Ausführung irgendeiner Klausel aus Employees.txt geladen.
  • 🔢 Sortieren nach Gesamtsummen: ORDER BY sendet das gesamte Ergebnis-Set an einen Reducer, was die vollständige Reihenfolge garantiert, aber große Abfragen verlangsamt.
  • 🔤 Zeichenkettensortierung: Eine Spalte mit Zeichenketten wie z. B. „Department“ wird in lexikografischer Reihenfolge und nicht in numerischer Reihenfolge zurückgegeben.
  • 📊 GROUP BY zählt: Die Kombination von GROUP BY mit count(*) liefert eine Zeile pro Abteilung mit der jeweiligen Mitarbeiterzahl.
  • 🔀 SORT BY gilt pro Reducer: SORT BY sortiert die Zeilen innerhalb jedes Reducers, sodass mehrere Reducer eine teilweise sortierte Ausgabe erzeugen.
  • 🎯 CLUSTER BY kombiniert: CLUSTER BY fungiert als DISTRIBUTE BY plus SORT BY, während DISTRIBUTE BY allein übereinstimmende Schlüssel unsortiert an einen Reducer weiterleitet.

Hive-Abfragen: Sortieren nach, Gruppieren nach, Cluster Von und Vertrieben durch

Hive bietet zusätzlich zu den bestehenden Funktionen eine SQL-ähnliche Abfragesprache für ETL-Zwecke. Hadoop Dateisystem.

Die Hive Query Language (HiveQL) bietet eine SQL-ähnliche Umgebung in Hive für die Arbeit mit Tabellen, Datenbanken und Abfragen.

Mit Hive sind verschiedene Arten von Klauseln verknüpft, um unterschiedliche Arten der Datenmanipulation und -abfrage durchzuführen. Hive bietet außerdem JDBC-Konnektivität für bessere Verbindungen mit Knoten außerhalb der Umgebung.

Hive-Abfragen bieten folgende Funktionen:

  • Datenmodellierung wie die Erstellung von Datenbanken, Tabellen usw.
  • ETL-Funktionalitäten wie z. B.tracDatentransformation, -umwandlung und -laden in Tabellen
  • Joins um verschiedene Datentabellen zusammenzuführen
  • Benutzerspezifische benutzerdefinierte Skripte zur Vereinfachung des Codes
  • Schnelleres Abfragetool zusätzlich zu Hadoop

Tabelle in Hive erstellen

Bevor wir zum Hauptthema dieses Tutorials kommen, erstellen wir zunächst eine Tabelle, die als Referenz für die folgenden Abschnitte dienen soll.

In diesem Tutorial erstellen wir die Tabelle „employees_guru“ mit 6 Spalten, wie der untenstehende Screenshot zeigt.

Hive-Anweisung CREATE TABLE für employees_guru und der Befehl load

Aus dem obigen Screenshot geht hervor,

  1. Wir erstellen die Tabelle „employees_guru“ mit 6 Spaltenwerten wie Id, Name, Age, Address, Salary, Department, die zu den Mitarbeitern der Organisation „guru“ gehören.
  2. In diesem Schritt laden wir Daten in die Tabelle employees_guru. Die zu ladenden Daten befinden sich in der Datei Employees.txt.

Bestellung nach Anfrage

Die ORDER BY-Syntax in HiveQL ist ähnlich der ORDER BY-Syntax in der SQL Sprache.

ORDER BY ist die Klausel, die wir mit der „SELECT“-Anweisung verwenden. Hive-Abfragen Zum Sortieren der Daten werden Spalten in Hive-Tabellen verwendet, um die mit ORDER BY angegebenen Spaltenwerte zu sortieren. Die Abfrage zeigt die Ergebnisse anschließend in aufsteigender oder absteigender Reihenfolge dieser Werte an.

Wenn das genannte ORDER BY-Feld ein String ist, wird das Ergebnis in lexikografischer Reihenfolge angezeigt. Im Backend muss das gesamte Ergebnis-Set an einen einzigen Reducer übergeben werden.

Dieser einzelne Reducer macht ORDER BY auch bei einer großen Tabelle teuer, daher im strikten Modus (hive.mapred.mode=strict) Hive lehnt eine ORDER BY-Anweisung ab, die keine LIMIT-Klausel enthält.

Der folgende Screenshot zeigt die ORDER BY-Abfrage und die sortierten Zeilen.

ORDER BY-Abfrage für employees_guru, sortiert nach Abteilung

Aus dem obigen Screenshot lässt sich Folgendes erkennen:

  1. Es handelt sich um eine Abfrage der Tabelle „employees_guru“ mit der ORDER BY-Klausel und dem Spaltennamen „Department“. Da „Department“ ein String ist, werden die Ergebnisse in lexikografischer Reihenfolge angezeigt.
  2. Dies ist die tatsächliche Ausgabe der Abfrage. Die Ergebnisse werden der Reihe nach nach der Spalte „Abteilung“ angezeigt, z. B. „Verwaltung“, „Finanzen“ usw.

Abfrage:

SELECT * FROM employees_guru ORDER BY Department;

Nach Abfrage gruppieren

Die GROUP BY-Klausel verwendet Spalten in Hive-Tabellen für die Gruppierung.ping Die mit GROUP BY angegebenen Spaltenwerte werden in der Abfrage gruppiert und angezeigt.

Der folgende Screenshot zeigt beispielsweise die Gesamtzahl der Mitarbeiter in jeder Abteilung. Hier ist „Abteilung“ als Gruppierungskriterium verwendet.

GROUP BY-Abfrage, die die Mitarbeiter in jeder Abteilung zählt.

Aus dem obigen Screenshot lässt sich Folgendes ablesen:

  1. Es handelt sich um eine Abfrage, die auf der Tabelle „employees_guru“ mit der GROUP BY-Klausel und Department als definiertem GROUP BY-Spaltennamen durchgeführt wird.
  2. Die hier angezeigte Ausgabe enthält den Abteilungsnamen und die Mitarbeiterzahl der einzelnen Abteilungen. Alle Mitarbeiter einer bestimmten Abteilung werden gruppiert und angezeigt, sodass jede Ergebniszeile den Abteilungsnamen mit der jeweiligen Mitarbeiterzahl enthält.

Abfrage:

SELECT Department, count(*) FROM employees_guru GROUP BY Department;

Sortieren nach

Die SORT BY-Klausel sortiert die Ausgabe anhand der Spaltennamen von Hive-Tabellen. Mit DESC wird absteigend und mit ASC aufsteigend sortiert.

SORT BY sortiert die Zeilen, bevor sie an den Reducer übergeben werden. Dadurch ist die Reihenfolge innerhalb jedes Reducers gewährleistet, nicht aber im gesamten Ergebnis. Die Sortierung hängt immer vom Spaltentyp ab.

Wenn der Spaltentyp beispielsweise numerisch ist, wird in numerischer Reihenfolge sortiert, und wenn der Spaltentyp Zeichenkette ist, wird in lexikografischer Reihenfolge sortiert.

Der folgende Screenshot zeigt die SORT BY-Abfrage mit DESC.

SORT BY-Abfrage für employees_guru, die die ID in absteigender Reihenfolge zurückgibt

Aus dem obigen Screenshot können wir Folgendes erkennen:

  1. Es handelt sich um eine Abfrage der Tabelle „employees_guru“ mit der SORT BY-Klausel und „Id“ als definiertem Spaltennamen für SORT BY. Wir haben das Schlüsselwort DESC verwendet.
  2. Die angezeigte Ausgabe erfolgt also in absteigender Reihenfolge der „Id“.

Abfrage:

SELECT * from employees_guru SORT BY Id DESC;

Cluster By

CLUSTER BY wird in HiveQL als Alternative sowohl für die DISTRIBUTE BY- als auch für die SORT BY-Klausel verwendet.

Die CLUSTER BY-Klausel wird auf Tabellen in Hive angewendet. Hive nutzt die Spalten in CLUSTER BY, um die Zeilen auf die Reducer zu verteilen, wobei Spalten aus CLUSTER BY an mehrere Reducer gesendet werden. Außerdem wird die Sortierreihenfolge der Werte in diesen Reducern sichergestellt.

Beispielsweise wird die CLUSTER BY-Klausel im Spaltennamen „Id“ der Tabelle „employees_guru“ erwähnt. Die Ausführung dieser Abfrage liefert Ergebnisse an mehrere Reducer im Backend, im Frontend dient sie jedoch als alternative Klausel für SORT BY und DISTRIBUTE BY.

Dies ist der Backend-Prozess, der bei einer Abfrage mit SORT BY, GROUP BY oder CLUSTER BY im MapReduce-Framework abläuft. Wenn wir also Ergebnisse in mehreren Reducern speichern möchten, verwenden wir CLUSTER BY.

Die CLUSTER BY-Grammatik akzeptiert nur Spaltennamen, daher können ASC und DESC nicht an sie angehängt werden; ein absteigendes Ergebnis erfordert DISTRIBUTE BY mit einem separaten SORT BY … DESC.

Der folgende Screenshot zeigt die CLUSTER BY-Abfrage für die ID.

CLUSTER BY-Abfrage für die Spalte "Id" von employees_guru

Aus dem obigen Screenshot können wir Folgendes feststellen:

  1. Es handelt sich um die Abfrage, die die CLUSTER BY-Klausel auf den Wert des Feldes „Id“ anwendet. Hier werden die Id-Werte sortiert.
  2. Es zeigt die in employees_guru vorhandenen Id- und Name-Werte in sortierter Reihenfolge an.

Abfrage:

SELECT  Id, Name from employees_guru CLUSTER BY Id;

Verteilen durch

Die DISTRIBUTE BY-Klausel wird für Tabellen in Hive verwendet. Hive nutzt die Spalten in DISTRIBUTE BY, um die Zeilen auf die Reducer zu verteilen, sodass alle Zeilen mit demselben Wert in der DISTRIBUTE BY-Spalte demselben Reducer zugeordnet werden.

  • Es stellt sicher, dass jeder der N Reduzierer eine Nichtüberlappung erhält.ping Satz der Spaltenwerte
  • Die Ausgabe der einzelnen Reducer wird nicht sortiert, und es wird nicht garantiert, dass übereinstimmende Zeilen nebeneinander stehen.

Der folgende Screenshot zeigt die DISTRIBUTE BY-Abfrage für die ID.

DISTRIBUTE BY-Abfrage für die Spalte "Id" von employees_guru

Aus dem obigen Screenshot lässt sich Folgendes erkennen:

  1. Die DISTRIBUTE BY-Klausel wird auf die ID der Tabelle „employees_guru“ angewendet.
  2. Die Ausgabe zeigt ID und Name an. Im Backend werden Zeilen mit derselben ID an denselben Reducer weitergeleitet.

Abfrage:

SELECT  Id, Name from employees_guru DISTRIBUTE BY Id;

Die vier Klauseln können leicht verwechselt werden, daher vergleicht die folgende Tabelle sie.

Klausel Verschiedene Verbindungsstücke Was es garantiert
SORTIEREN NACH Eins Gesamtergebnis
SORT BY - check Viele Bestellung nur innerhalb jedes Reduzierstücks
VERTEILEN DURCH Viele Derselbe Schlüssel erreicht denselben Reduzierer, unsortiert
Cluster nach Viele VERTEILEN NACH plus SORTIEREN NACH, aufsteigend

Häufig gestellte Fragen

Ein einzelner Reducer muss jede Zeile sortieren, was bei einer großen Tabelle stundenlang dauern kann. Hier kommen LIMIT-Grenzen ins Spiel. Durch Setzen von `hive.mapred.mode` auf `nonstrict` wird diese Einschränkung vollständig aufgehoben.

Setzen Sie `mapreduce.job.reduces` vor der Abfrage, um die Anzahl festzulegen. Andernfalls schätzt Hive sie anhand der Eingabegröße. `ORDER BY` ignoriert diese Einstellung, da eine totale Sortierung immer auf einen Reducer reduziert wird.

Nein. Die Klausel akzeptiert nur Spaltennamen und sortiert immer aufsteigend. Verwenden Sie stattdessen DISTRIBUTE BY für die Partitionierungsspalte und eine separate SORT BY-Spalte DESC; die beiden Spalten können sich auch unterscheiden.

Sie sind verwandt, aber nicht identisch. Eimer speichert Zeilen dauerhaft in einer festen Anzahl von Dateien, während CLUSTER BY Zeilen nur für die Dauer einer Abfrage verteilt und sortiert.

Assistenten für maschinelles Lernen lesen den EXPLAIN-Plan und kennzeichnen Ursachen wie eine unbegrenzte ORDER BY-Klausel, einen fehlenden Partitionsfilter oder einen fehlerhaften Schlüssel. Jede Empfehlung wird anhand der tatsächlichen Laufzeit überprüft.

Es leitet diese Muster gut aus einem kurzen Kommentar ab. Überprüfen Sie alles Motorspezifische, da es leicht mit anderen Faktoren vermischt wird. Spark SQL- oder Presto-Syntax, die Hive ablehnt, wie z. B. DESC nach CLUSTER BY.

Eine einfache Textdatei namens Employees.txt enthält die Werte der sechs Spalten und wird vor der Ausführung der ersten Abfrage in die Tabelle geladen. Jede durch Trennzeichen getrennte Datei mit übereinstimmenden Spalten funktioniert auf die gleiche Weise.

Die Semantik ist identisch, da es sich um Sprachmerkmale von HiveQL und nicht um Engine-Merkmale handelt. Lediglich der physische Ablauf ändert sich – die Engines planen die Sortier- und Mischvorgänge unterschiedlich, wodurch die Laufzeiten variieren, die Ergebnisse jedoch gleich bleiben.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: