18 Stimmen

Hive: Dynamische Partition, die zur externen Tabelle hinzugefügt wird

Ich führe Hive 071 aus und verarbeite vorhandene Daten, die die folgende Verzeichnisstruktur aufweisen:
-Tabellenname
- d= (z.B. 2011-08-01)
- d=2011-08-02
- d=2011-08-03

... usw.
Unter jedem Datum habe ich die Datumsdateien.
Um nun die Daten zu laden, verwende ich

CREATE EXTERNAL TABLE table_name (i int)  
PARTITIONED BY (date String)  
LOCATION '${hiveconf:basepath}/TableName';**  

Ich möchte, dass mein Hive-Skript in der Lage ist, die relevanten Partitionen nach einem Eingabedatum und der Anzahl der Tage zu laden. wenn ich also date='2011-08-03' y days='7'
Das Skript sollte t laden - d=2011-08-03
- d=2011-08-04
- d=2011-08-05
- d=2011-08-06
- d=2011-08-07
- d=2011-08-08
- d=2011-08-09

Ich habe keinen vernünftigen Weg gefunden, dies zu tun, außer es explizit auszuführen:

ALTER TABLE table_name ADD PARTITION (d='2011-08-03');  
ALTER TABLE table_name ADD PARTITION (d='2011-08-04');  
ALTER TABLE table_name ADD PARTITION (d='2011-08-05');  
ALTER TABLE table_name ADD PARTITION (d='2011-08-06');  
ALTER TABLE table_name ADD PARTITION (d='2011-08-07');  
ALTER TABLE table_name ADD PARTITION (d='2011-08-08');  
ALTER TABLE table_name ADD PARTITION (d='2011-08-09');  

und dann meine Abfrage ausführen

select count(1) from table_name;

Dies geschieht jedoch nicht automatisch entsprechend den eingegebenen Daten und Tagen.

Gibt es eine Möglichkeit, die externe Tabelle so zu definieren, dass Partitionen nach Datumsbereich oder Datumsarithmetik geladen werden?

9voto

Ptah Punkte 561

Ich habe ein sehr ähnliches Problem, bei dem ich nach einer Migration eine Tabelle neu erstellen muss, für die ich zwar die Daten, aber nicht die Metadaten habe. Die Lösung scheint zu sein, nach der Neuerstellung der Tabelle:

MSCK REPAIR TABLE table_name;

Hier wird erklärt

Darin wird auch die "alter table X recover partitions" dass OP seinen eigenen Beitrag kommentiert hat. MSCK REPAIR TABLE table_name; funktioniert auf Nicht-Amazon-EMR-Implementierungen (in meinem Fall Cloudera).

0voto

rgordon0 Punkte 46

Die Partitionen sind eine physische Segmentierung der Daten - wobei die Partition vom Verzeichnissystem verwaltet wird und die Abfragen die Metadaten verwenden, um zu bestimmen, wo sich die Partition befindet. Wenn Sie also die Verzeichnisstruktur mit der Abfrage in Einklang bringen können, sollte sie die gewünschten Daten finden. zum Beispiel:

select count(*) from table_name where (d >= '2011-08-03) and (d <= '2011-08-09');

aber mir sind keine Datumsbereichsoperationen bekannt, sonst müssten Sie erst einmal das Abfragemuster erstellen.

können Sie auch externe Tabellen erstellen und ihnen Partitionen hinzufügen, die den Standort definieren. Auf diese Weise können Sie die Daten nach Belieben schreddern und dennoch das Partitionsschema zur Optimierung der Abfragen verwenden.

0voto

brandon.bell Punkte 1411

Ich glaube nicht, dass es in Hive dafür eine eingebaute Funktion gibt. Vielleicht können Sie ein Plugin schreiben. Benutzerdefinierte UDFs erstellen

Wahrscheinlich müssen Sie das nicht erwähnen, aber haben Sie ein einfaches Bash-Skript in Betracht gezogen, das Ihre Parameter übernimmt und die Befehle an Hive weiterleitet?

Oozie-Workflows wären eine weitere Option, aber das könnte zu viel des Guten sein. Oozie Bienenstock Erweiterung - Nach einigem Nachdenken glaube ich nicht, dass Oozie dafür geeignet wäre.

-3voto

Tanveer Punkte 872

Ich habe ein ähnliches Szenario in meinem Blogbeitrag erläutert:

1) Sie müssen Eigenschaften festlegen:

SET hive.exec.dynamic.partition=true;
SET hive.exec.dynamic.partition.mode=nonstrict;

2) Erstellen Sie eine externe Staging-Tabelle, um die Daten der Eingabedateien in diese Tabelle zu laden.

3) Erstellen Sie eine externe Hauptproduktionstabelle "production_order" mit dem Datumsfeld als eine der partitionierten Spalten.

4) Laden Sie die Produktionstabelle aus der Staging-Tabelle, damit die Daten automatisch in Partitionen verteilt werden.

Ein ähnliches Konzept wird in dem folgenden Blogbeitrag erläutert. Wenn Sie den Code sehen wollen.

http://exploredatascience.blogspot.in/2014/06/dynamic-partitioning-with-hive.html

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X