Einführung
Der Einzelhändler erhält täglich eine neue Datei. Frühere Berichte filterten Datensätze nach einem Datum innerhalb jeder Zeile. Eine partitionierte Tabelle hält zusätzlich eine datumsbezogene Organisation in ihren Metadaten fest, sodass eine Abfrage die registrierten Datenorte des angeforderten Datums auswählen kann.
Zwei Dinge müssen übereinstimmen: die Dateien in HDFS und die Partitionseinträge im Metastore von Hive, dem Katalog für Tabellen- und Partitionsdefinitionen. Ein Verzeichnis zu erstellen registriert für sich genommen keine Hive-Partition. Sie beobachten diesen Unterschied direkt, indem Sie Dateien eines neuen Tages vor ihrer Registrierung hinzufügen.
Dieses Lab bereitet unabhängig Dateien für zwei Tage und eine lokale Lieferung für einen dritten Tag vor. Sie erstellen die partitionierte externe Tabelle, registrieren Speicherorte, lesen die Partitionsspalte und untersuchen einen gefilterten Abfrageplan. Hive ist bereit; Installation oder vorheriger VM-Zustand sind nicht erforderlich. Kenntnisse externer Tabellen und einfacher Datumsfilter genügen. Verwenden Sie das Terminal.
Trennen Sie Dateispalten von der Partitionsspalte
In diesem Schritt definieren Sie eine nach Datum partitionierte Tabelle, ohne das Datum in jedem Datensatz zu wiederholen. Prüfen Sie eine vorbereitete Datei:
cd /home/labex/project
cat /home/labex/project/data/orders-2026-10-14.csv
Es gibt sechs Dateispalten. Anders als die frühere CSV mit sieben Spalten besitzt diese Datei kein Feld order_date: Eine Datei enthält nur Bestellungen eines Datums. Prüfen Sie die bereits vorbereiteten täglichen HDFS-Verzeichnisse:
hdfs dfs -ls /user/labex/hive-partitions/orders
Ein Verzeichnisname wie order_date=2026-10-14 macht die Organisation für Menschen lesbar. Hive benötigt trotzdem einen registrierten Partitionswert und Speicherort, um ihn zu verwenden.
Die folgende Tabelle deklariert ihre sechs Dateifelder wie gewohnt und order_date DATE separat in PARTITIONED BY. Hive liefert diese siebte abfragbare Spalte aus den Partitionsmetadaten. Fügen Sie sie nicht beiden Deklarationen hinzu und ergänzen Sie in diesen Dateien kein siebtes Feld.
Speichern und starten Sie die Tabellendefinition. Das Here-Dokument schreibt den SQL-Text zwischen den SQL-Markern wörtlich. Beelines -f führt das gespeicherte Skript aus; Verbindungs-URL und Benutzername beziehen sich auf den vorbereiteten lokalen Hive-Dienst:
cat > /home/labex/project/queries/create-partitioned-orders.sql <<'SQL'
CREATE EXTERNAL TABLE retail_partitions.orders (
order_id STRING, customer_id STRING, product_id STRING,
quantity INT, unit_price DECIMAL(10,2), order_status STRING
)
PARTITIONED BY (order_date DATE)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION 'hdfs://localhost:9000/user/labex/hive-partitions/orders'
TBLPROPERTIES ('skip.header.line.count'='1', '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-partitioned-orders.sql
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "DESCRIBE retail_partitions.orders;"
DESCRIBE enthält die gewöhnlichen Felder und die Partitionsinformationen. Zählen Sie nun die Zeilen, bevor Partitionen registriert sind:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT COUNT(*) FROM retail_partitions.orders;" > /home/labex/project/output/before-registration.tsv
cat /home/labex/project/output/before-registration.tsv
Erwarten Sie 0. Die Tabellendefinition existiert, und unter ihrem Basisverzeichnis liegen Dateien, aber diese neue Tabelle hat noch keine Partitionseinträge. Dies ist eine Metadatengrenze und kein Beleg, dass die CSV gelöscht wurde.
Registrieren Sie die beiden vorhandenen Tagesorte
In diesem Schritt verbinden Sie jeden Datumswert mit seinem tatsächlichen Verzeichnis. ALTER TABLE ... ADD PARTITION fügt Partitionseinträge zum Metastore hinzu. Jedes PARTITION (...) liefert einen Datumswert, und seine LOCATION die entsprechenden Dateien. Dies sind statische Partitionen: Sie benennen jeden Wert ausdrücklich.
Speichern Sie beide Registrierungen in einem Skript:
cat > /home/labex/project/queries/register-first-dates.sql <<'SQL'
ALTER TABLE retail_partitions.orders ADD
PARTITION (order_date='2026-10-14') LOCATION 'hdfs://localhost:9000/user/labex/hive-partitions/orders/order_date=2026-10-14'
PARTITION (order_date='2026-10-15') LOCATION 'hdfs://localhost:9000/user/labex/hive-partitions/orders/order_date=2026-10-15';
SQL
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -f /home/labex/project/queries/register-first-dates.sql
Listen Sie die registrierten Werte auf und lesen Sie die Datumsspalte:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SHOW PARTITIONS retail_partitions.orders;" > /home/labex/project/output/registered-dates.tsv
cat /home/labex/project/output/registered-dates.tsv
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT order_id, order_date FROM retail_partitions.orders ORDER BY order_id;" > /home/labex/project/output/registered-orders.tsv
cat /home/labex/project/output/registered-orders.tsv
SHOW PARTITIONS sollte den 14. und 15. Oktober enthalten. Die Abfrage liefert o1–o3 mit dem 14. Oktober und o4–o6 mit dem 15. Oktober. Das Datum stammt aus der jeweils registrierten Partition, nicht aus einem verborgenen siebten CSV-Feld.
Die Registrierung verweist auf vorhandene Daten; sie kopiert oder verändert die Quelldateien nicht. Die Tabelle stellt nun alle sechs Bestellungen bereit, einschließlich ausstehender und erstatteter Datensätze. Ein Bericht über bezahlte Verkäufe benötigt weiterhin seinen Statusfilter.
Fügen Sie zuerst Dateien hinzu und registrieren Sie dann ein neues Datum
In diesem Schritt weisen Sie nach, dass ein neues Verzeichnis und ein neuer Partitionseintrag getrennte Aktionen sind. Prüfen Sie die vorbereitete lokale Lieferung vom 16. Oktober:
cat /home/labex/project/data/orders-2026-10-16.csv
Erstellen Sie ihr HDFS-Verzeichnis und laden Sie die Datei hoch. Diese bekannten Befehle betreffen nur den Speicher:
hdfs dfs -mkdir -p /user/labex/hive-partitions/orders/order_date=2026-10-16
hdfs dfs -put /home/labex/project/data/orders-2026-10-16.csv /user/labex/hive-partitions/orders/order_date=2026-10-16/orders.csv
Fragen Sie Hive vor der Registrierung nach der Zeilenanzahl dieses Datums:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT COUNT(*) FROM retail_partitions.orders WHERE order_date = DATE '2026-10-16';" > /home/labex/project/output/new-date-before.tsv
cat /home/labex/project/output/new-date-before.tsv
Erwarten Sie trotz der hochgeladenen Datei 0. Ergänzen Sie die fehlenden Metadaten und wiederholen Sie die datumsspezifische Abfrage:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "ALTER TABLE retail_partitions.orders ADD PARTITION (order_date='2026-10-16') LOCATION 'hdfs://localhost:9000/user/labex/hive-partitions/orders/order_date=2026-10-16';"
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT order_id, customer_id, order_status, order_date FROM retail_partitions.orders WHERE order_date = DATE '2026-10-16' ORDER BY order_id;" > /home/labex/project/output/new-date-orders.tsv
cat /home/labex/project/output/new-date-orders.tsv
Nun erscheinen o7/c1/paid und o8/c2/pending mit dem 16. Oktober. Hive kann diesen Partitionswert dem hochgeladenen Verzeichnis zuordnen. Dieser bewusste Vorher-Nachher-Vergleich erklärt, warum eine neue Lieferdatei in HDFS vorhanden sein, aber in einem Bericht fehlen kann.
Lesen Sie eine partitionsgefilterte Abfrage und ihren Plan
In diesem Schritt wählen Sie ein registriertes Datum aus und prüfen, wie Hive diese Anfrage plant. Speichern Sie die Abfrage mit der Partitionsspalte in WHERE:
cat > /home/labex/project/queries/query-sales-partition.sql <<'SQL'
SELECT order_id, quantity, order_date
FROM retail_partitions.orders
WHERE order_date = DATE '2026-10-15'
ORDER BY order_id;
SQL
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -f /home/labex/project/queries/query-sales-partition.sql > /home/labex/project/output/selected-partition.tsv
cat /home/labex/project/output/selected-partition.tsv
Erwarten Sie o4/2, o5/1 und o6/2, alle mit dem 15. Oktober. Dies ist eine Datumsauswahl, noch kein Filter für bezahlte Verkäufe: Die erstattete Bestellung o5 bleibt in dieser konkreten Abfrage zu Recht enthalten.
EXPLAIN beschreibt eine Abfrage, ohne deren Datenzeilen zurückzugeben. Seine Option DEPENDENCY konzentriert sich auf die Tabellen und Partitionen, die die Abfrage lesen wird. Diese kompakte Ansicht lässt Sie die Eingabeauswahl untersuchen, ohne zuerst Interna der Ausführungsphasen lernen zu müssen. Stellen Sie derselben Abfrage EXPLAIN DEPENDENCY voran und speichern Sie das Ergebnis:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "EXPLAIN DEPENDENCY SELECT order_id, quantity, order_date
FROM retail_partitions.orders
WHERE order_date = DATE '2026-10-15'
ORDER BY order_id;" > /home/labex/project/output/partition-plan.txt
cat /home/labex/project/output/partition-plan.txt
Das Ergebnis ist JSON, ein Textformat mit benannten Feldern und Listen. Finden Sie input_tables mit dem Namen retail_partitions@orders sowie input_partitions, dessen einziger partitionName auf order_date=2026-10-15 endet. Die anderen beiden Tage fehlen in der Eingabeliste. Die Datumsbedingung erlaubt Hive, die relevante registrierte Partition auszuwählen, bevor es deren Datensätze liest. Dies heißt Partition Pruning, also das Beschränken auf benötigte Partitionen. Das kleine Beispiel dient zum Verständnis dieser Auswahl; die Abfragelaufzeit ist daher kein sinnvoller Leistungsvergleich.
Listen Sie abschließend die registrierten Partitionen erneut auf:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SHOW PARTITIONS retail_partitions.orders;"
Alle drei Tage sollten weiterhin registriert sein. Die Auswahl eines Datums ändert die Eingabeauswahl der Abfrage; sie entfernt keine anderen Partitionseinträge und löscht deren Dateien nicht. Sie haben nun sowohl auf Speicher- als auch auf Katalogebene Belege, um zu erklären, welche Tagesdaten eine Abfrage sehen kann.
Zusammenfassung
Sie haben Dateifelder von der Partitionsspalte getrennt, tägliche HDFS-Speicherorte in Hive registriert und beobachtet, dass ein neues Verzeichnis bis zum Hinzufügen seiner Partition unsichtbar blieb. Anschließend haben Sie ein Datum ausgewählt und dessen Abfrageplan untersucht, während alle Tage erhalten blieben. Als Nächstes speichern Sie Abfrageergebnisse in einer wiederverwendbaren spaltenorientierten ORC-Tabelle.



