Ihre erste Hive-Abfrage

Big DataBeginner
Jetzt üben

Einführung

Stellen Sie sich vor, Sie öffnen die Bestelldaten des Einzelhändlers in einer Tabellenkalkulation. Jede Zeile beschreibt eine Bestellung und jede Spalte ein Merkmal wie Datum oder Zahlungsstatus. Sie möchten eine einfache Frage beantworten: Welche bezahlten Bestellungen sollte das Team zuerst prüfen? Mit wachsenden Dateien wird es unpraktisch, jede Zeile von Hand zu lesen.

Mit Apache Hive können Sie Dateidaten als Tabellen beschreiben und mit SQL, der Structured Query Language, abfragen. Eine Tabellendefinition beschreibt die Spalten und den Speicherort der zugrunde liegenden Dateien; die Dateien enthalten die tatsächlichen Datensätze. Hive verwendet diese Definition, um Daten zu interpretieren und eine Abfrage auszuführen. In dieser vorbereiteten Umgebung stellt HDFS den Speicher bereit, während Hive die Tabellen- und Abfrageebene liefert. Das Hochladen einer Datei allein macht sie nicht automatisch zu einer Hive-Tabelle.

Hive eignet sich für analytische Abfragen gespeicherter Daten, etwa Batch-Berichte. Es entspricht nicht dem Bearbeiten von Zellen in einer Tabellenkalkulation, und dieser Kurs stellt es nicht als Ersatz für die Transaktionsdatenbank jeder Anwendung dar. Sie beginnen mit sechs übersichtlichen Datensätzen, damit Sie die richtige Antwort vorhersagen können, bevor Sie mit größeren Eingaben arbeiten.

Sie verwenden Beeline, den Terminalclient von Hive, um sich mit einem laufenden HiveServer2-Dienst zu verbinden. Dienst und Beispieltabelle sind vorbereitet. Sie müssen weder Software installieren noch Metadaten initialisieren oder Java, Python, Hadoop oder SQL bereits kennen. Grundlegende Terminalkenntnisse und die Fähigkeit, eine Tabelle zu lesen, genügen. Weitere Übungen zu Terminal oder Datenbanken finden Sie in den Lernpfaden Linux und Database.

Ihr Lernweg: echte Zeilen ansehen, die Tabellenstruktur erkunden, eine Abfrage für bezahlte Bestellungen speichern und eine Bedingung ändern, um Ihr Verständnis zu prüfen.

Sehen Sie Ihre ersten Hive-Zeilen

In diesem Schritt verbinden Sie sich mit Hive und lesen eine vorbereitete Tabelle, bevor Sie lernen, eine Abfrage einzugrenzen.

Verwenden Sie die Registerkarte Terminal. Wechseln Sie mit cd in das lokale Projektverzeichnis:

cd /home/labex/project

Beeline ist ein Client: Er sendet SQL an HiveServer2, das die Abfrage bearbeitet. Im folgenden Befehl gibt -u die Verbindungs-URL an, -n den Sitzungsbenutzernamen und -e das SQL, das vor der Rückkehr ins Terminal ausgeführt wird. Die bereitgestellte URL verbindet sich mit dem Hive-Dienst dieses Rechners auf Port 10000, zunächst mit der Datenbank default. Für diesen Übungsdienst benötigen Sie weder ein externes Konto noch ein Passwort.

Das SQL SELECT * FROM retail_intro.orders; fordert alle Spalten (*) aus der Tabelle orders in der Datenbank retail_intro an. Ein Semikolon beendet die Anweisung. Einfache Anführungszeichen halten die gesamte SQL-Anweisung als ein Shell-Argument zusammen:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex -e 'SELECT * FROM retail_intro.orders;'

Suchen Sie nach sechs Bestellzeilen und Spaltennamen wie order_id, quantity und order_status. Verbindungsmeldungen und Tabellenrahmen können die Ergebnisse umgeben. Finden Sie Bestellung o1: Sie hat Menge 2, Einzelpreis 10.00 und Status paid. Bestellung o3 ist pending; o5 ist refunded. Jede Zeile ist eine vereinfachte Bestellung mit einem Produkttyp.

Eine Abfrage ruft Daten ab; dieses SELECT verändert weder Zahlungsstatus noch Quelldatei. Ohne Sortierklausel dürfen Sie nicht annehmen, dass SQL eine bestimmte Zeilenreihenfolge zusichert.

Erfassen Sie dieselbe Abfrageausgabe in einer lokalen Mitschrift. Der Shell-Operator > erstellt die Datei oder ersetzt ihren bisherigen Inhalt:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex -e 'SELECT * FROM retail_intro.orders;' > /home/labex/project/output/first-look.txt

Lesen Sie sie lokal:

cat /home/labex/project/output/first-look.txt

Die Bestellzeilen sollten weiterhin vorhanden sein. Das Terminal hat den Beeline-Client ausgeführt, Hive hat Tabellendefinition und Dateien gelesen, und die Shell hat das angezeigte Ergebnis lokal gespeichert. Als Nächstes erkunden Sie die Objekte hinter dieser Abfrage.

Erkunden Sie Datenbank, Tabelle und Spalten

In diesem Schritt untersuchen Sie Datenbank und Tabellendefinition, statt Spaltennamen zu erraten.

Eine Datenbank ist ein Namensraum, der Tabellen zusammenfasst. SHOW DATABASES listet verfügbare Datenbanken auf; es liest nicht alle zugehörigen Datendateien:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex -e 'SHOW DATABASES;'

Finden Sie default und retail_intro. Wählen Sie mit USE eine Datenbank aus, gefolgt von SHOW TABLES im selben Aufruf:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex -e 'USE retail_intro; SHOW TABLES;'

Sie sollten orders finden. Jeder Befehl mit -e öffnet eine neue Beeline-Sitzung. Ein USE in einem Aufruf wird daher nicht stillschweigend in den nächsten übernommen. Wählen Sie die Datenbank entweder in jeder SQL-Datei aus oder verwenden Sie den qualifizierten Namen retail_intro.orders.

DESCRIBE listet Spalten und Typen der Tabelle auf. Beispielsweise speichert STRING Text, INT Ganzzahlen, DECIMAL(10,2) Festkommazahlen mit zwei Nachkommastellen, und DATE stellt ein Kalenderdatum dar:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex -e 'DESCRIBE retail_intro.orders;'

Ordnen Sie die Felder den Zeilen der ersten Abfrage zu. Menge und Preis haben unterschiedliche Bedeutungen und Typen, obwohl beide numerisch aussehen. Geldbeträge berechnen Sie in einem späteren Lab; heute lesen Sie nur die bereitgestellten Felder.

Für gespeicherte Abfrageergebnisse kann Beeline ein einfaches Textformat verwenden. --outputformat=tsv2 wählt tabulatorgetrennte Felder, --showHeader=false lässt die Kopfzeile weg, und --silent=true verringert Clientmeldungen. Speichern Sie das beschriebene Schema mit diesen Ausgabeoptionen:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e 'DESCRIBE retail_intro.orders;' > /home/labex/project/output/table-schema.txt

Die Mitschrift kann auch Laufzeitmeldungen enthalten. Die wichtigen Schemazeilen nennen alle sieben Spalten und ihre Typen. Die Tabellendefinition sind Metadaten: Sie sagen Hive, wie gespeicherte Dateien zu interpretieren sind. Im nächsten Lab erstellen Sie diese Zuordnung selbst.

Speichern Sie eine Abfrage für die ersten bezahlten Bestellungen

In diesem Schritt wählen Sie nur die vom Prüfteam benötigten Spalten und bezahlten Zeilen mit vorhersehbarer Ergebnisreihenfolge aus.

Eine Abfrage kann Daten auf mehrere unabhängige Arten eingrenzen:

Klausel Zweck hier
SELECT Ausgabespalten auswählen
FROM Quelltabelle auswählen
WHERE Zeilen behalten, deren Bedingung wahr ist
ORDER BY Ergebnis ausdrücklich sortieren
LIMIT Höchstens die angeforderte Zeilenanzahl zurückgeben

Sie fordern order_id, order_status und quantity an, behalten nur Zeilen mit paid, sortieren nach Bestell-ID und geben die ersten beiden zurück. Sagen Sie voraus, welche Zeilen bleiben: Unter den sechs bereitgestellten Bestellungen sind o1 und o2 in dieser Reihenfolge die ersten bezahlten IDs.

Speichern Sie SQL in einer lokalen Datei, damit es geprüft und erneut ausgeführt werden kann. Im nächsten Shell-Befehl beginnt cat > file <<'SQL' ein Here-Dokument: Die Zeilen bis zum abschließenden SQL werden wörtlich in die Datei geschrieben. Sie sind SQL-Text, keine Shell-Befehle. Kopieren Sie den vollständigen Block einschließlich der Begrenzungszeilen:

cat > /home/labex/project/queries/first-query.sql <<'SQL'
USE retail_intro;
SELECT order_id, order_status, quantity
FROM orders
WHERE order_status = 'paid'
ORDER BY order_id
LIMIT 2;
SQL

Das in Anführungszeichen gesetzte 'paid' im SQL ist ein Textwert. = vergleicht den Status jeder Zeile mit diesem Wert; es weist keinen neuen Status zu. Die Anweisung USE macht die Datei unabhängig von einer vorherigen Clientsitzung.

Die Beeline-Option -f liest eine lokale SQL-Datei. Führen Sie Ihre Datei aus und speichern Sie die Ausgabe mit den gerade gelernten Textformatoptionen:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -f /home/labex/project/queries/first-query.sql > /home/labex/project/output/first-query.txt

Lesen Sie die gespeicherte Mitschrift:

cat /home/labex/project/output/first-query.txt

Die Ergebniszeilen sollten so lauten:

o1 paid 2
o2 paid 1

Etwaige umgebende Laufzeitmeldungen sind keine Bestelldatensätze. LIMIT 2 bedeutete nicht zwei beliebige Zeilen: Die ausdrückliche Sortierung bestimmte, welche passenden Zeilen zuerst kamen. Sie haben nun eine wiederverwendbare Abfragedatei und ein beobachtbares Ergebnis für die Frage des Teams.

Sagen Sie die Wirkung einer geänderten Bedingung voraus

In diesem Schritt ändern Sie nur die Statusbedingung und prüfen, ob die zurückgegebenen Zeilen Ihrer Vorhersage entsprechen.

Bewahren Sie die Abfrage für bezahlte Bestellungen unverändert auf. In derselben Tabelle existiert eine Bestellung mit pending: o3 mit Menge 1. Wie viele Zeilen sollte ein Limit von zwei zurückgeben, wenn Sie die Statusbedingung von paid auf pending ändern? Ein Limit ist eine Höchstzahl, also lautet die Antwort: eine.

Schreiben Sie dieselbe Abfrage mit nur dieser geänderten Bedingung:

cat > /home/labex/project/queries/pending-query.sql <<'SQL'
USE retail_intro;
SELECT order_id, order_status, quantity
FROM orders
WHERE order_status = 'pending'
ORDER BY order_id
LIMIT 2;
SQL

Führen Sie sie unabhängig aus:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -f /home/labex/project/queries/pending-query.sql > /home/labex/project/output/pending-query.txt

Lesen Sie das erfasste Ergebnis:

cat /home/labex/project/output/pending-query.txt

Die einzige Bestellzeile sollte so lauten:

o3 pending 1

Ein geänderter Filter wählte eine andere Zeile aus, ohne die gespeicherten Tabellendatensätze zu verändern. Sie haben nun mit derselben grundlegenden Abfragestruktur zwei Fragen beantwortet. Als Nächstes verbinden Sie eine vorhandene CSV-Datei mit einer Tabellendefinition, statt eine vorbereitete Tabelle zu verwenden.

Zusammenfassung

Sie haben Hive in einen Ablauf von Datei über Tabelle zur Abfrage eingeordnet, sich mit Beeline verbunden und Datenbank, Tabelle und Schema erkundet. Sie haben eine wiederverwendbare SQL-Datei mit Auswahl, Filterung, ausdrücklicher Sortierung und Zeilenlimit geschrieben und anschließend die Änderung einer Bedingung vorhergesagt und geprüft.

Für diesen ersten Einstieg war die Tabelle vorbereitet. Im nächsten Lab ordnen Sie eine CSV-Datei Ihrer eigenen externen Tabelle zu und lernen, wie Metadaten und zugrunde liegende Dateien zusammenhängen.