2013-03-07 11 views
10

I file di registro sono memorizzati come testo in HDFS. Quando carico i file di registro in una tabella Hive, tutti i file vengono copiati.È possibile importare dati nella tabella Hive senza copiare i dati

Posso evitare di memorizzare tutti i miei dati di testo due volte?

EDIT: ho caricarlo tramite il seguente comando

LOAD DATA INPATH '/user/logs/mylogfile' INTO TABLE `sandbox.test` PARTITION (day='20130221') 

Poi, posso trovare lo stesso file esatto in:

/user/hive/warehouse/sandbox.db/test/day=20130220 

ho pensato che è stato copiato.

+0

Come si dice, è copiato? Come li caricate in tavoli alveari? –

+0

Lo carico tramite 'LOAD DATA INPATH 'xxx' INTO TABLE yyy' (vedi post edit) quindi trovo il file in'/user/hive/warehouse'. Mi chiedo se può lasciarlo lì (suppongo che avrei dovuto imporre la struttura delle partizioni nelle mie directory, ma va bene) –

+0

Come è stato memorizzato in HDFS? –

risposta

14

una tabella esterna:

CREATE EXTERNAL TABLE sandbox.test(id BIGINT, name STRING) ROW FORMAT 
       DELIMITED FIELDS TERMINATED BY ',' 
       LINES TERMINATED BY '\n' 
       STORED AS TEXTFILE 
       LOCATION '/user/logs/'; 

se si desidera utilizzare il partizionamento con una tabella esterna, sarà responsabile della gestione delle directory di partizione. la posizione specificata deve essere una directory hdfs ..

Se si rilascia un hive di tabella esterna NON si elimineranno i dati di origine. Se si si desidera gestire i file raw, utilizzare tabelle esterne. Se vuoi che l'alveare lo faccia, il magazzino di lasciare l'alveare all'interno del suo percorso di magazzino.

+0

Esattamente quello che stavo cercando! Grazie –

3

Posso dire, invece di copiare i dati dall'applicazione java direttamente su HDFS, avere questi file nel file system locale e importarli in HDFS tramite hive usando il seguente comando.

LOAD DATA LOCAL INPATH '/your/local/filesystem/file.csv' INTO TABLE `sandbox.test` PARTITION (day='20130221') 

Avviso l'uso LOCAL

+0

Grazie, funzionerebbe davvero. Un'altra opzione (meno efficiente) era quella di eliminare il file originale. Quindi immagino che la risposta sia: no, non puoi dire all'hive di lasciare i dati dove si trova e presumere che sia un tavolo.Poiché i file sono veramente grandi, l'applicazione Java scrive direttamente in HDFS con la libreria Hadoop. Posso fare la stessa cosa con un connettore Java to Hive? In alternativa, se scrivo tramite l'API HDFS nella corretta directory hive, Hive suppone che sia un file di dati? –

+1

Circa l'ultima parte. Sì, se inserisci il file direttamente nel magazzino HIVE, la data sarà disponibile in HIVE, ricorda di adattare la struttura della cartella alla definizione della tabella (http://stackoverflow.com/questions/15077046/using-multiple-levels-of- partitions-in-hive/15102064 # 15102064) – www

0

È possibile utilizzare l'istruzione di alterazione della tabella per evitare la duplicazione dei dati.

create External table if not exists TestTable (testcol string) PARTITIONED BY (year INT,month INT,day INT) row format delimited fields terminated by ','; 

ALTER table TestTable partition (year='2014',month='2',day='17') location 'hdfs://localhost:8020/data/2014/2/17/'; 
0

Hive (almeno quando si esegue in modalità cluster reale) non può fare riferimento a file esterni nel file system locale. Hive può importare automaticamente i file durante la creazione della tabella o l'operazione di caricamento. La ragione di ciò può essere che Hive esegue internamente i lavori MapReduce per estrarre i dati. MapReduce legge da HDFS e scrive su HDFS e persino in modalità distribuita. Quindi, se il file è memorizzato nel file system locale, non può essere utilizzato dall'infrastruttura distribuita.

Problemi correlati