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.