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
È 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.
È 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.
utilizzoEsempio - LOAD DATA INPATH LOCAL '/ home/utente/some-directory' SOVRASCRIVI INTO TABLE
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 –
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
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. –