2017-12-11 6 views
0

Ich möchte den Archivierungs- und Bereinigungsmechanismus auf Hive-Tabellen anwenden, die interne und externe Tabellen enthalten und sowohl partitioniert als auch nicht partitioniert sind.Archiv der Hive-Tabellen

Ich habe eine site_visitors-Tabelle und ihre Partition mit visit_date. Und ich wollte die Daten der site_visitors-Tabelle archivieren, wo Benutzer in meinem letzten Jahr nicht meine Website besucht haben. Gleichzeitig möchte ich diese archivierten Daten nicht im selben Tabellenverzeichnis aufbewahren. Ich kann Daten an einem bestimmten Ort archiviert haben.

Antwort

1

Sie können das auf den Partitionen im HDFS-Verzeichnis behandeln, unten ist eine der Möglichkeiten, die Sie erreichen können.

Ihre interne Tabelle/Main Tabelle wird auf der Oberseite der hdfs sitzen und das Verzeichnis wird wie etwas aussehen unten hdfs:namenonde/user/hive/warehouse/schema.db/site_visitors/visit_date=2017-01-01 hdfs:namenonde/user/hive/warehouse/schema.db/site_visitors/visit_date=2017-01-02 hdfs:namenonde/user/hive/warehouse/schema.db/site_visitors/visit_date=2017-01-03

Sie können eine Archiv Tabelle oben auf HDFS erstellen oder wenn Sie gerade suchen, um die Daten zu archivieren Sie können die Partitionen an einen anderen Speicherort in HDFS ablegen. Wie auch immer, Ihr HDFS-Speicherort wird ungefähr wie folgt aussehen.

hdfs:namenonde/hdfs_location/site_visitors/visit_date=2017-01-01 hdfs:namenonde/hdfs_location/site_visitors/visit_date=2017-01-02 hdfs:namenonde/hdfs_location/site_visitors/visit_date=2017-01-03

Sie können einen UNIX-Skript oder Javascript oder in einer anderen Sprache ausführen, die in Ihrer Umgebung verwendet wird, um die Dateien von einem HDFS Ort zur anderen Archiv hdfs Lage auf den Partitionsdaten auf Basis zu bewegen.

Sie können auch mit dem folgenden Ansatz tun, wo Sie die Daten in die Archivtabelle laden und die Daten in der Originaltabelle löschen können.

#!bin/bash 
 
ARCHIVE=$1 
 
now=$(date +%Y-%m-%d) 
 
StartDate=$now 
 
#archive_dt will give a date based on the ARCHIVE date and that be will used for alterations and loading 
 
archive_dt=$(date --date="${now} - ${ARCHIVE} day" +%Y-%m-%d) 
 
EndDate=$archive_dt 
 
#You can use hive or beeline or impala to insert the data into archive table, i'm using beeline for my example 
 
beeline -u ${CONN_URL} -e "insert into table ${SCHEMA}.archive_table partition (visit_date) select * from ${SCHEMA}.${TABLE_NAME} where visit_date < ${archive_dt}" 
 
#After the data been loaded to the archive table i can drop the partitions in original table 
 
beeline -u ${CONN_URL} -e "ALTER TABLE ${SCHEMA}.main_table DROP PARTITION(visit_date < ${archive_dt})" 
 
#Repair the tables to sync the metadata after alterations 
 
beeline -u ${CONN_URL} -e "MSCK REPAIR TABLE ${SCHEMA}.main_table; MSCK REPAIR TABLE archiveSchema.archive_table"

+0

Dank rob für Ihre Anregungen. Das ist ein guter Ansatz. Was, wenn ich auch die älteren Daten aus HBase-Tabellen archivieren wollte? – RahulN

+0

Wenn Sie denken, dass meine Antwort für Sie funktioniert hat, kreuzen Sie bitte meine Antwort an. – roh

+0

Bitte stellen Sie die HBase-Frage als separate Frage, Sie werden in diesem Fall viele andere Antworten als meine hören können. Hoffe du magst meinen Vorschlag. – roh