2013-01-17 11 views
5

Recentemente voglio caricare i file di registro in tabelle hive, voglio uno strumento in grado di leggere i dati da una determinata directory e caricarli automaticamente in hive. Questa directory può includere molte sottodirectory, ad esempio, la directory certa è '/ log' e le sottodirectory sono '/ log/20130115', '/ log/20130116', '/ log/201301017'. Esistono alcuni strumenti ETL che possono ottenere la funzione: una volta che i nuovi dati sono memorizzati in una determinata directory, lo strumento può rilevare automaticamente questi dati e caricarli in una tabella alveare. C'è un tale strumento, devo scrivere script da solo?come caricare automaticamente i dati nell'alveare

risposta

4

È possibile farlo facilmente utilizzando le tabelle esterne di Hive e partizionando la tabella di giorno. Ad esempio, creare la tabella come tale:

create external table mytable(...) 
partitioned by (day string) 
location '/user/hive/warehouse/mytable'; 

Ciò essenzialmente creare una tabella vuota nella metastore e farlo puntare a /user/hive/warehouse/mytable.

Quindi è possibile caricare i dati in questa directory con formato chiave = valore dove chiave è il vostro nome della partizione (qui "giorno") e il valore è il valore della partizione. Per esempio:

hadoop fs -put /log/20130115 /user/hive/warehouse/mytable/day=20130115 

volta che i dati è stato caricato lì, è nella directory HDFS, ma il metastore Hive non sa ancora che appartiene al tavolo, in modo da poter aggiungere in questo modo:

alter table mytable add partition(day='20130115'); 

E dovresti essere a posto, il metastore verrà aggiornato con la tua nuova partizione e ora puoi interrogare la tua tabella su questa partizione.

Questo dovrebbe essere banale per script, è possibile creare un processo di cron in esecuzione una volta al giorno che farà questi comandi in ordine e trovare la partizione di caricare con il comando date, ad esempio facendo in modo continuo questo comando:

hadoop fs -test /log/`date +%Y%m%d` 

e verificare se $? è uguale a 0 ti dirà se il file è qui e se lo è, puoi trasferirlo e aggiungere la partizione come descritto sopra.

+0

Grazie tante, infatti, ho una ulteriore domanda, in questo modo posso caricare la mia i file di registro divisi per data in tabelle hive, tuttavia, il mio capo mi ha chiesto di trovare un approccio o strumento per caricare i dati, ovvero: supponendo che ci sia una determinata directory chiamata '/ log', l'hive interrogherà questa directory per tutto il tempo , una volta creati i nuovi dati, forse/log/20130118,/log/20130119, l'hive aggiungerà automaticamente questa partizione e caricherà il file di registro come/20130118 o/20130119 nella partizione della tabella, come posso ottenerlo, chiedi scusa –

+0

Quando si specifica la parola chiave 'EXTERNAL' i tuoi dati non vengono copiati ovunque e rimangono nella posizione in cui li hai inseriti. (Quando non si specifica 'EXTERNAL', Hive copia i dati nella propria posizione predefinita). Per quanto ne so, ogni volta che aggiungi un file alla cartella specificata da "LOCATION" e successivamente esegui una query nella tua tabella, i nuovi dati dovrebbero essere visibili. È passato un po 'di tempo da quando ho giocato con Hive, quindi forse @Charles Menguy può confermare questo? – Pieterjan

+0

Non sono sicuro al 100% di aver capito cosa vuoi ottenere, puoi modificare la tua domanda con maggiori dettagli?Se vuoi semplicemente caricare i file nella tabella senza partizioni di date, @Pieterjan ha ragione, puoi semplicemente mettere i file nella radice della tabella in HDFS e non devi modificare la tabella, Hive sceglierà direttamente su. –

1

È possibile utilizzare il comando LOAD DATA fornito da Hive. Corrisponde esattamente al tuo caso d'uso. Specifica una directory nel tuo file system locale e crea tabelle Hive.

utilizzo

Esempio - LOAD DATA INPATH LOCAL '/ home/utente/some-directory' SOVRASCRIVI INTO TABLE

Problemi correlati