2013-01-11 5 views
5

Ich arbeite an einem Telekommunikationsprojekt, das Hadoop - Hive für die Datenanalyse verwendet. Für einen Tag werden wir Millionen von Datensätzen erhalten. Nach der angegebenen Anzahl von Tagen müssen wir die alten Daten löschen, da wir keine Speicherkapazität haben. Was ist der beste Weg, um Datensätze zu löschen?Hadoop - Hive: Löschen von Daten, die älter sind als angegebene Anzahl von Tagen

Zusätzliche Information:

Diese hive Tabellen eine Spalte, die den bevölkerten Datum haben.

Antwort

11

Ich denke, Ihr Anwendungsfall eignet sich sehr gut für die Verwendung einer "Tag" -Partition in Ihrer Hive-Tabelle. Wenn der "Tag" nur eine Spalte ist, wird es schwierig, Ihren Tisch zu pflegen und zu reinigen.

Was für eine Partition wirklich in Hive bedeutet, dass Sie ein Verzeichnis für jeden „Tag“ haben

So zum Beispiel:

create table mytable (
    ... 
) partitioned by (day string) 

Also, wenn Sie Daten hinzufügen, Sie würden zum Beispiel die folgende Struktur in HDFS:

/user/hive/warehouse/mytable/day=2013-01-10 
/user/hive/warehouse/mytable/day=2013-01-11 
... 

Und in jeder Partition hätten Sie den Inhalt für diesen Tag.

Dann alten Daten wird trivial zu löschen, Sie könnten zum Beispiel einen cron-Job, der täglich läuft und löscht Daten für vor x Tagen (zum Beispiel den Befehl date --date '30 days ago' +\%Y-\%m-\%d verwenden) und einfach tun Sie den folgenden Befehl:

hadoop fs -rmr -skiptrash /user/hive/warehouse/mytable/day=`date --date '30 days ago' +\%Y-\%m-\%d` 

An diesem Punkt haben Sie immer noch Ihre Partition in Ihrer Hive-Tabelle, wenn Sie eine show partitions mytable tun, aber jede Abfrage an die Partitionen, wo Sie Daten gelöscht haben, wird nichts zurückgeben. Wenn Sie wirklich wollen, um die Partition in der Metastore löschen müssen Sie den folgenden Befehl verwenden:

ALTER TABLE mytable DROP PARTITION (day='xxxx-xx-xx'); 

Ich habe ein sehr ähnliches Muster erfolgreich für eine Weile und es funktioniert gut.

Verwandte Themen