Erstellen Sie eine externe Tabelle aus CSV-Dateien

Big DataBeginner
Jetzt üben

Einführung

Im ersten Hive-Lab konnten Sie mit einer vorbereiteten Tabelle sofort Bestellzeilen abfragen. Nun hat der Einzelhändler CSV-Dateien geliefert, doch eine gespeicherte Datei ist noch keine Tabelle, die Hive abfragen kann. Sie müssen ihre Felder beschreiben und das Verzeichnis ihrer Daten angeben.

Eine externe Tabelle ist eine Tabellendefinition, die auf unabhängig von dieser Definition verwaltete Daten verweist. Ihr Schema legt Spaltennamen und Typen fest, und ihre LOCATION verweist auf gespeicherte Dateien. Das Erstellen der Definition lädt keine Dateien hoch und schreibt deren Inhalt nicht um. Hive speichert Tabellenmetadaten in seinem Metastore, während die Datensätze im Speicher verbleiben.

Sie laden zwei einfache CSV-Quellen hoch, ordnen die erste einem ausdrücklichen Schema zu, ändern die Zuordnung auf die zweite und löschen nur eine entbehrliche externe Tabellendefinition. Der letzte Versuch verwendet ausdrückliche Eigenschaften für den Datenerhalt in der Hive-Version dieses Kurses. Er ist keine Zusicherung, dass das Löschen jeder denkbaren Hive-Tabelle Dateien erhält. Dienste und lokale Eingaben sind unabhängig vorbereitet; weder der Hadoop-Kurs noch eine Programmiersprache sind erforderlich. Verwenden Sie das Terminal.

Prüfen Sie die Quelldateien und laden Sie sie hoch

In diesem Schritt untersuchen Sie das CSV-Format und kopieren die beiden bereitgestellten Dateien in getrennte HDFS-Verzeichnisse.

Beginnen Sie in Ihrem lokalen Projekt:

cd /home/labex/project

Eine CSV-Datei trennt Felder durch Kommas. Diese Übungsdateien enthalten einfache Werte ohne eingebettete Kommas, mehrzeiligen Text in Anführungszeichen oder maskierte Trennzeichen. Das hier verwendete einfache Tabellenformat wurde für diese Eingaben gewählt, nicht als allgemeingültiger Parser für jeden CSV-Dialekt.

Der lokale Befehl head -n 4 zeigt die ersten vier Zeilen:

head -n 4 /home/labex/project/data/orders-a.csv

Sie sollten eine Kopfzeile und drei Bestelldatensätze sehen:

order_id,customer_id,product_id,quantity,unit_price,order_status,order_date
o1,c1,p1,2,10.00,paid,2026-10-14
o2,c2,p2,1,25.00,paid,2026-10-14
o3,c1,p1,1,10.00,pending,2026-10-14

Zählen Sie mit wc -l die durch Zeilenumbruch abgeschlossenen Zeilen:

wc -l /home/labex/project/data/orders-a.csv /home/labex/project/data/orders-b.csv

Quelle A hat sieben Zeilen, aber nur sechs Geschäftsdatensätze; Quelle B hat drei Zeilen, aber nur zwei Datensätze. Die Kopfzeile darf nicht zu einer Bestellzeile werden.

HDFS ist ein separates Dateisystem, das der vorbereitete Hive-Dienst verwendet. Der Client hdfs dfs verwaltet dessen Dateien. -mkdir -p erstellt die benannten HDFS-Verzeichnisse und fehlende übergeordnete Verzeichnisse:

hdfs dfs -mkdir -p /user/labex/hive-mapping/source-a /user/labex/hive-mapping/source-b

Die Operation -put kopiert eine lokale Quelle an ein HDFS-Ziel und lässt das Original unverändert bestehen:

hdfs dfs -put /home/labex/project/data/orders-a.csv /user/labex/hive-mapping/source-a/orders.csv

Laden Sie die zweite Quelle in ihr eigenes Verzeichnis hoch:

hdfs dfs -put /home/labex/project/data/orders-b.csv /user/labex/hive-mapping/source-b/orders.csv

Ein erfolgreicher Upload gibt normalerweise nichts aus. Prüfen Sie ein bereits vorhandenes Ziel, bevor Sie über ein Überschreiben entscheiden; löschen Sie keine Rohdaten, nur um einen Befehl zu wiederholen. Lesen Sie die erste HDFS-Datei mit -cat:

hdfs dfs -cat /user/labex/hive-mapping/source-a/orders.csv

Kopfzeile und sechs Datensätze sind weiterhin vorhanden. Hochladen erhält Bytes; eine Tabellendefinition sagt Hive, wie sie zu interpretieren sind.

Definieren Sie die Zuordnung von Datei zu Tabelle

In diesem Schritt erstellen Sie eine externe Tabelle mit ausdrücklichen Feldern, Typen, einem Verzeichnis als Speicherort und einer Kopfzeilenbehandlung.

Die Feldreihenfolge der Quelle muss mit der Spaltenreihenfolge der Tabelle übereinstimmen. Verwenden Sie STRING für Kennungen und Status, INT für ganzzahlige Mengen, DECIMAL(10,2) für Festkommapreise und DATE für das Datum im ISO-Format. Dezimalpreise vermeiden Näherungen durch binäre Gleitkommazahlen bei späteren Geldberechnungen.

CREATE DATABASE IF NOT EXISTS erstellt bei Bedarf den Namensraum. CREATE EXTERNAL TABLE registriert dann eine Tabellendefinition. Die Formatklauseln legen kommagetrennten Text fest; LOCATION benennt das Verzeichnis. Halten Sie deshalb nicht zugehörige Dateien und Sicherungskopien außerhalb davon. Die beiden Eigenschaften überspringen eine Kopfzeile pro Datei und deaktivieren in dieser Umgebung ausdrücklich das Entfernen externer Tabellendaten bei DROP.

Speichern Sie die vollständige SQL-Datei. Wie im ersten Lab schreibt das Here-Dokument der Shell wörtliche Zeilen bis zur abschließenden Begrenzung SQL:

cat > /home/labex/project/queries/create-orders.sql <<'SQL'
CREATE DATABASE IF NOT EXISTS retail_mapping;
USE retail_mapping;
CREATE EXTERNAL TABLE raw_orders (
  order_id STRING,
  customer_id STRING,
  product_id STRING,
  quantity INT,
  unit_price DECIMAL(10,2),
  order_status STRING,
  order_date DATE
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION 'hdfs://localhost:9000/user/labex/hive-mapping/source-a'
TBLPROPERTIES ('skip.header.line.count'='1', 'external.table.purge'='false');
SQL

Führen Sie die Datei mit Beeline aus. Verbindung und Dateioption -f entsprechen dem ersten Lab:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true -f /home/labex/project/queries/create-orders.sql

Dies sind DDL-Anweisungen (Data Definition Language): SQL-Anweisungen, die Objekte wie Tabellen definieren. Erfolgreiche DDL-Anweisungen erstellen Metadaten, statt Bestellzeilen zurückzugeben. Falls die Tabelle von einem abgeschlossenen Lauf bereits existiert, prüfen Sie sie, statt sie nur zur Beseitigung der Meldung zu löschen.

DESCRIBE FORMATTED enthält neben den Spalten auch Typ und Speicherort der Tabelle:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex -e 'DESCRIBE FORMATTED retail_mapping.raw_orders;'

Finden Sie EXTERNAL_TABLE und den Speicherort mit der Endung /hive-mapping/source-a. Dies sind Metadatenbeobachtungen, keine Belege, dass jeder Datensatz korrekt eingelesen wurde. Verwenden Sie auch eine Abfrage. COUNT(*) zählt die Tabellenzeilen und ermöglicht damit eine schnelle Prüfung der Zuordnung. AS order_count gibt diesem berechneten Ergebnis einen Spaltennamen, einen sogenannten Alias; es benennt kein Quellfeld um und verändert keine gespeicherten Datensätze:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex -e 'SELECT COUNT(*) AS order_count FROM retail_mapping.raw_orders; SELECT order_id, quantity, unit_price, order_date FROM retail_mapping.raw_orders ORDER BY order_id LIMIT 2;'

Die Anzahl sollte 6 sein, nicht die sieben Textzeilen der Datei. Die ersten beiden Datensätze sollten die IDs o1, o2, Mengen 2, 1, numerisch die Preise 10.00, 25.00 und das Datum 2026-10-14 enthalten. Sie haben sowohl die Kopfzeilenbehandlung als auch sinnvoll typisierte Spalten geprüft.

Verweisen Sie mit derselben Tabelle auf eine neue Quelle

In diesem Schritt ändern Sie den Speicherort der Tabelle und sagen voraus, wie sich ihre Zeilen ändern, ohne eine der Quelldateien zu verschieben.

Quelle B besitzt dieselben Felder, enthält aber die Bestellungen o7 und o8. Lesen Sie die gespeicherte Datei, bevor Sie Metadaten ändern:

hdfs dfs -cat /user/labex/hive-mapping/source-b/orders.csv

Sie sollten ihre Kopfzeile und zwei Datensätze sehen. Sagen Sie die Tabellenzeilenanzahl nach der Umstellung auf dieses Verzeichnis voraus: zwei statt sechs. ALTER TABLE ... SET LOCATION ändert den Verzeichnisverweis in der Tabellendefinition. Es kopiert weder alte Daten in das neue Verzeichnis noch führt es die beiden Lieferungen zusammen.

Speichern Sie diese Metadatenänderung:

cat > /home/labex/project/queries/map-second-source.sql <<'SQL'
ALTER TABLE retail_mapping.raw_orders SET LOCATION 'hdfs://localhost:9000/user/labex/hive-mapping/source-b';
SQL

Führen Sie sie aus:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true -f /home/labex/project/queries/map-second-source.sql

Prüfen Sie Metadaten und Daten erneut:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex -e 'DESCRIBE FORMATTED retail_mapping.raw_orders; SELECT COUNT(*) AS order_count FROM retail_mapping.raw_orders; SELECT order_id, quantity, unit_price FROM retail_mapping.raw_orders ORDER BY order_id;'

Finden Sie den neuen Speicherort source-b, die Anzahl 2 und die Zeilen für o7 und o8. Ihre Mengen sind 1 und 2, ihre Preise numerisch 50.00 und 15.00. Die Spaltendefinitionen sind unverändert; nur die durch sie gelesenen Dateien haben sich geändert.

Lesen Sie die alte Datei, um zu prüfen, dass die geänderte Zuordnung sie nicht entfernt hat:

hdfs dfs -cat /user/labex/hive-mapping/source-a/orders.csv

Ihre sechs Datensätze und die Kopfzeile sollten weiterhin vorhanden sein. Dateiexistenz und Sichtbarkeit über eine Tabelle sind unterschiedliche Tatsachen: Quelle A existiert noch, obwohl diese Tabelle jetzt Quelle B liest.

Löschen Sie nur eine entbehrliche Tabellendefinition

In diesem Schritt erstellen und entfernen Sie eine externe Tabellendefinition über der aufbewahrten ersten Quelle, während Daten und Haupttabelle erhalten bleiben.

Das Löschen einer Tabellendefinition und das Löschen ihrer Daten sind unterschiedliche Operationen. Verwenden Sie für diesen Versuch den separaten Namen disposable_orders mit den ausdrücklichen Eigenschaften zum Erhalt externer Daten. Halten Sie raw_orders, das nun Quelle B zugeordnet ist, währenddessen verfügbar.

Erstellen Sie die entbehrliche Definition über Quelle A mit demselben bekannten Schema:

cat > /home/labex/project/queries/create-disposable.sql <<'SQL'
CREATE EXTERNAL TABLE retail_mapping.disposable_orders (
  order_id STRING,
  customer_id STRING,
  product_id STRING,
  quantity INT,
  unit_price DECIMAL(10,2),
  order_status STRING,
  order_date DATE
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION 'hdfs://localhost:9000/user/labex/hive-mapping/source-a'
TBLPROPERTIES ('skip.header.line.count'='1', 'external.table.purge'='false');
SQL

Führen Sie die Definition aus:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true -f /home/labex/project/queries/create-disposable.sql

Prüfen Sie, dass beide Tabellennamen existieren:

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

Sie sollten disposable_orders und raw_orders sehen. DROP TABLE entfernt eine Tabellendefinition. Hier zielt es nur auf die entbehrliche externe Tabelle, deren purge-Eigenschaft ausdrücklich false ist:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex -e 'DROP TABLE retail_mapping.disposable_orders; SHOW TABLES IN retail_mapping;'

Nur raw_orders sollte übrig bleiben. Prüfen Sie nun unabhängig davon die Quelldatei:

hdfs dfs -cat /user/labex/hive-mapping/source-a/orders.csv

Kopfzeile und sechs Datensätze sollten erhalten bleiben. Dieses beobachtete Verhalten gilt für diese Konfiguration einer externen Tabelle. Eine verwaltete Tabelle oder eine externe Tabelle mit anderen purge-Eigenschaften kann beim Löschen Daten entfernen. Verallgemeinern Sie diesen Versuch daher nicht zu einer universellen Löschregel.

Bestätigen Sie, dass die Haupttabelle weiterhin Quelle B liest:

beeline -u 'jdbc:hive2://localhost:10000/default' -n labex -e 'SELECT order_id FROM retail_mapping.raw_orders ORDER BY order_id;'

Sie sollten weiterhin o7 und o8 sehen. Sie haben drei häufig verwechselte Operationen getrennt: Bytes hochladen, Metadaten registrieren oder ändern und eine Definition entfernen. Als Nächstes filtern Sie mit diesen korrekt zugeordneten Zeilen nach Bedingungen und behandeln fehlende Werte.

Zusammenfassung

Sie haben einfache CSV-Quellen hochgeladen, Feldreihenfolge und Typen deklariert, Kopfzeilen übersprungen und eine externe Tabelle an einem ausdrücklichen HDFS-Verzeichnis registriert. Sie haben Metadaten und tatsächliche Datensätze geprüft und anschließend den Tabellenspeicherort geändert, ohne eine Quelldatei zu verschieben.

Abschließend haben Sie eine entbehrliche externe Tabellendefinition mit ausdrücklichen Aufbewahrungseinstellungen entfernt und bestätigt, dass Dateien und Haupttabelle verfügbar blieben. Als Nächstes bauen Sie auf einer verlässlichen Zuordnung auf, um Zeilen auszuwählen und fehlende Werte zu behandeln.