Speichern Sie Hive-Abfrageergebnisse als ORC-Tabellen

Big DataBeginner
Jetzt üben

Einführung

Eine im Terminal angezeigte Abfrage ist einmal nützlich. Ein Bericht, den andere Abfragen wiederverwenden können, benötigt ein gespeichertes Ergebnis. Sie verwandeln die tägliche Abfrage bezahlter Verkäufe des Einzelhändlers in eine kleine Hive-Tabelle und erstellen diese Tabelle gezielt neu, wenn derselbe Bericht erneut angefordert wird.

Die Quelle ist lesbarer CSV-Text. ORC, Optimized Row Columnar, ist ein binäres spaltenorientiertes Speicherformat: Es ordnet Werte innerhalb seiner Dateistruktur nach Spalten und kann effizientes analytisches Lesen unterstützen. Es ist weder eine andere SQL-Sprache noch ein Ersatz für das Tabellenschema. Das kleine Beispiel demonstriert korrekte Speicherung und Wiederverwendung, statt einen Geschwindigkeitsgewinn zu beweisen.

Dieses Lab bereitet unabhängig die sechs sauberen Bestellungen in einer externen Texttabelle vor. Hive ist bereit. Externe Tabellen, SELECT, Aggregation bezahlter Verkäufe und Datumsgruppierung sollten Sie verstehen. Die Anweisungen zum Schreiben von Ergebnissen lernen Sie hier anhand ausdrücklich nichttransaktionaler Tabellen, die diese vorbereitete Umgebung unterstützt. Programmierung, Installation oder Dateien vorheriger Labs sind nicht erforderlich. Verwenden Sie das Terminal.

Definieren Sie eine typisierte ORC-Berichtstabelle

In diesem Schritt erstellen Sie ein leeres Ziel, dessen Schema zum vorgesehenen Bericht passt. Wie die CSV-Quelle ist das Ziel eine ausdrücklich externe Tabelle mit bekanntem HDFS-Speicherort. Ihr Format ist ORC statt Text. Extern beschreibt die Beziehung zwischen Metadaten und Dateien; es bedeutet nicht, dass die Tabelle schreibgeschützt ist. Hive kann ein SELECT-Ergebnis hineinschreiben. Der Ergebnisort ist von der Quelle getrennt, sodass ein Neuerstellen des Berichts die ursprünglichen Bestellungen nicht ersetzt.

Beginnen Sie im Arbeitsverzeichnis:

cd /home/labex/project

Die Ausgabe besitzt pro Zeile ein Datum, eine Anzahl und einen Geldgesamtbetrag. COUNT(*) erzeugt eine BIGINT-Anzahl. DECIMAL(14,2) sieht insgesamt vierzehn Dezimalstellen vor, davon zwei nach dem Dezimalpunkt; das genügt für diesen kleinen Bericht. Das ausdrückliche Schema hilft zu verhindern, dass Beträge versehentlich als Text gespeichert werden.

Speichern und starten Sie die Definition. Das Here-Dokument schreibt SQL wörtlich zwischen seinen Markern; Beelines -f führt diese Datei am vorbereiteten Dienst aus:

cat > /home/labex/project/queries/create-orc-report.sql <<'SQL'
CREATE EXTERNAL TABLE IF NOT EXISTS retail_orc.daily_sales (
  order_date DATE,
  paid_orders BIGINT,
  revenue DECIMAL(14,2)
)
STORED AS ORC
LOCATION 'hdfs://localhost:9000/warehouse/external/retail_orc.db/daily_sales'
TBLPROPERTIES ('transactional'='false', 'external.table.purge'='false');
SQL
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -f /home/labex/project/queries/create-orc-report.sql

STORED AS ORC wählt das Format. LOCATION benennt ein neues Ergebnisverzeichnis unter dem beschreibbaren Warehouse-Verzeichnis der vorbereiteten Datenbank. external.table.purge=false erhält Dateien beim Löschen der externen Definition; es verhindert nicht, dass ausdrückliches Überschreiben Berichtszeilen ersetzt. transactional=false fordert eine nichttransaktionale Tabelle an. Hive kann diese false-Eigenschaft in angezeigten Metadaten weglassen; nur true würde sie als transaktional kennzeichnen. Dieses Lab behandelt keine ACID-Aktualisierungen oder -Löschungen. Prüfen Sie Metadaten und die leere Zeilenanzahl:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "DESCRIBE FORMATTED retail_orc.daily_sales;" > /home/labex/project/output/orc-definition.txt
cat /home/labex/project/output/orc-definition.txt
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT COUNT(*) FROM retail_orc.daily_sales;" > /home/labex/project/output/empty-report.tsv
cat /home/labex/project/output/empty-report.tsv

Finden Sie die drei Spaltentypen, den externen Tabellentyp und die ORC-Eingabe-/Ausgabeformatnamen. Erwarten Sie 0 Zeilen: Die Definition eines Ziels hat weder die Verkaufsberechnung gestartet noch CSV-Daten kopiert. Als Nächstes füllen Sie es ausdrücklich.

Schreiben Sie den Tagesbericht und lesen Sie ihn zurück

In diesem Schritt führen Sie das SELECT für bezahlte Verkäufe aus und speichern dessen Ausgabe dauerhaft. INSERT OVERWRITE TABLE ersetzt den aktuellen Inhalt der Zieltabelle durch das SELECT-Ergebnis. Es überschreibt nicht die gelesene externe Bestelltabelle. Die ausgewählten Werte werden den Zielspalten der Reihe nach zugewiesen: Datum, Anzahl, Umsatz.

Speichern Sie ein vollständiges Skript zum Neuerstellen. CREATE TABLE IF NOT EXISTS erlaubt die erneute Definition, wenn die korrekt definierte Tabelle bereits existiert; es repariert kein falsches Schema. Das folgende INSERT erstellt den eigentlichen Bericht:

cat > /home/labex/project/queries/build-sales-report.sql <<'SQL'
CREATE EXTERNAL TABLE IF NOT EXISTS retail_orc.daily_sales (
  order_date DATE,
  paid_orders BIGINT,
  revenue DECIMAL(14,2)
)
STORED AS ORC
LOCATION 'hdfs://localhost:9000/warehouse/external/retail_orc.db/daily_sales'
TBLPROPERTIES ('transactional'='false', 'external.table.purge'='false');
INSERT OVERWRITE TABLE retail_orc.daily_sales
SELECT order_date, COUNT(*) AS paid_orders,
       SUM(quantity * unit_price) AS revenue
FROM retail_orc.orders
WHERE order_status = 'paid'
GROUP BY order_date;
SQL
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -f /home/labex/project/queries/build-sales-report.sql

Erfolgreicher Abschluss bedeutet, dass das Schreiben beendet wurde. Bestätigen Sie dies durch Abfragen der gespeicherten ORC-Tabelle, statt nur das ursprüngliche SELECT über die Quelle erneut auszuführen:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT order_date, paid_orders, revenue FROM retail_orc.daily_sales ORDER BY order_date;" > /home/labex/project/output/stored-report.tsv
cat /home/labex/project/output/stored-report.tsv

Erwarten Sie 14. Oktober / 2 / 45.00 und 15. Oktober / 2 / 80.00. Die Gelddarstellung kann angehängte Nullen enthalten. Dies sind zwei gespeicherte Ergebniszeilen, die vier bezahlte Quellbestellungen zusammenfassen, keine sechs Kopien der ursprünglichen CSV-Datensätze.

ORC-Dateien sind binär; ihre Bytes mit cat anzuzeigen würde daher keine lesbare CSV ergeben. Hive interpretiert Tabellenschema und Dateiformat, wenn Sie SELECT darauf ausführen. Die Quelldateien bleiben gewöhnlicher Text und behalten alle sechs Bestellungen einschließlich der beiden ausgeschlossenen Statuswerte.

Erstellen Sie den Bericht ohne doppelte Tage neu

In diesem Schritt testen Sie die Wiederholbarkeit. Sagen Sie die Zeilenanzahl voraus, wenn Sie dasselbe Überschreibskript erneut ausführen. Das Ziel sollte weiterhin zwei Tage enthalten statt vier kopierter Zusammenfassungszeilen:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -f /home/labex/project/queries/build-sales-report.sql
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT order_date, paid_orders, revenue FROM retail_orc.daily_sales ORDER BY order_date;" > /home/labex/project/output/rebuilt-report.tsv
cat /home/labex/project/output/rebuilt-report.tsv

Der Bericht sollte weiterhin 14. Oktober / 2 / 45.00 und 15. Oktober / 2 / 80.00 enthalten. Prüfen Sie einen kompakten Abgleich direkt aus der Ergebnistabelle:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT COUNT(*), SUM(paid_orders), SUM(revenue) FROM retail_orc.daily_sales;" > /home/labex/project/output/report-reconciliation.tsv
cat /home/labex/project/output/report-reconciliation.tsv

Erwarten Sie 2 gespeicherte Berichtszeilen, 4 bezahlte Quellbestellungen und 125.00 Umsatz. Die Zeilenanzahl des Ergebnisses und die Summe von paid_orders beschreiben verschiedene Detailebenen.

Vergleichen Sie die gespeicherten Vorher-Nachher-Daten lokal. Da beide SELECT-Anweisungen ORDER BY verwenden, ist die Datenzeilenreihenfolge stabil. Beeline kann Clientmeldungen enthalten; der sinnvolle Vergleich betrifft daher die datierten Ergebniszeilen und den numerischen Abgleich statt Zeitstempel von Meldungen.

Dieses Neuerstellen ist bei unveränderter Eingabe idempotent: Eine Wiederholung hinterlässt denselben Berichtsinhalt. Als Nächstes zeigt ein entbehrliches Ziel, warum der Schreibmodus wichtig ist.

Vergleichen Sie Anhängen und Überschreiben an einer Übungskopie

In diesem Schritt duplizieren Sie absichtlich einen kleinen abgeleiteten Bericht in einer separaten Tabelle. Ihre Haupttabelle daily_sales bleibt der korrekte Bericht. Erstellen Sie die entbehrliche Tabelle mit demselben ausdrücklichen Schema:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "CREATE EXTERNAL TABLE IF NOT EXISTS retail_orc.append_demo (
  order_date DATE,
  paid_orders BIGINT,
  revenue DECIMAL(14,2)
)
STORED AS ORC
LOCATION 'hdfs://localhost:9000/warehouse/external/retail_orc.db/append_demo'
TBLPROPERTIES ('transactional'='false', 'external.table.purge'='false');"

INSERT INTO TABLE hängt SELECT-Ergebnisse an vorhandene Inhalte an. Hängen Sie den zweizeiligen Hauptbericht zweimal an:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "INSERT INTO TABLE retail_orc.append_demo SELECT order_date, paid_orders, revenue FROM retail_orc.daily_sales;"
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "INSERT INTO TABLE retail_orc.append_demo SELECT order_date, paid_orders, revenue FROM retail_orc.daily_sales;"
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT COUNT(*), SUM(paid_orders), SUM(revenue) FROM retail_orc.append_demo;" > /home/labex/project/output/append-observation.tsv
cat /home/labex/project/output/append-observation.tsv

Erwarten Sie 4 Zeilen, 8 aufsummierte bezahlte Bestellungen und 250.00 Umsatz. Die zusätzlichen Zeilen sind doppelte Berichtskopien, keine neuen Verkäufe. Es kamen keine neuen Bestellungen hinzu; das Anhängen eines vollständigen neu erstellten Berichts ergab das falsche Geschäftsergebnis.

Ersetzen Sie den Übungsinhalt mit dem zuvor gelernten Schreibmodus durch eine Kopie:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "INSERT OVERWRITE TABLE retail_orc.append_demo SELECT order_date, paid_orders, revenue FROM retail_orc.daily_sales;"
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT order_date, paid_orders, revenue FROM retail_orc.append_demo ORDER BY order_date;" > /home/labex/project/output/overwrite-observation.tsv
cat /home/labex/project/output/overwrite-observation.tsv

Es kehrt zu den beiden korrekten Tageszeilen zurück. Wiederholen Sie als kleine Übungsprüfung dieses Überschreiben noch einmal:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "INSERT OVERWRITE TABLE retail_orc.append_demo SELECT order_date, paid_orders, revenue FROM retail_orc.daily_sales;"
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT COUNT(*), SUM(revenue) FROM retail_orc.append_demo;"

Erwarten Sie erneut 2 Zeilen und 125.00. Anhängen ist sinnvoll, wenn tatsächlich neue, nicht überlappende Daten hinzukommen; das Neuerstellen eines vollständigen Datenstands benötigt dagegen Ersetzen. Ihr gespeichertes Hauptskript verwendet Überschreiben und kann daher den vollständigen Bericht neu erstellen, ohne unbemerkt doppelte Tage anzusammeln.

Zusammenfassung

Sie haben eine typisierte nichttransaktionale ORC-Ergebnistabelle definiert, tägliche Summen bezahlter Verkäufe geschrieben, zurückgelesen und das wiederholbare Neuerstellen getestet. Ein Anhängeversuch an einer Übungstabelle demonstrierte, wie doppelte Berichtskopien Umsatz aufblähen und Überschreiben einen vollständigen Datenstand wiederherstellt. Als Nächstes diagnostizieren Sie häufige Zuordnungsfehler zwischen Dateien und Tabellen vor der abschließenden Berichts-Challenge.