2012-11-14 9 views
12

Ricevo i valori null durante il caricamento dei dati da file flat in tabelle hive.
mia struttura tabelle è come questo:ottenere valori null durante il caricamento dei dati da file flat in tabelle alveari

hive> create table test_hive (id int,value string); 

e il mio file flat è come questo: input.txt

1 a 
2 b 
3 c 
4 d 
5 e 
6 F 
7 G 
8 j 

quando io sono in esecuzione i seguenti comandi sto ottenendo valori nulli:

hive> LOAD DATA LOCAL INPATH '/home/hduser/input.txt' OVERWRITE INTO TABLE test_hive; 
hive> select * from test_hive; 
OK<br> 
NULL NULL 
NULL NULL 
NULL NULL 
NULL NULL 
NULL NULL 
NULL NULL 
NULL NULL 
NULL NULL 

screen shot:

hive> create table test_hive (id int,value string); 
OK 
Time taken: 4.97 seconds 
hive> show tables; 
OK 
test_hive 
Time taken: 0.124 seconds 
hive> LOAD DATA LOCAL INPATH '/home/hduser/input2.txt' OVERWRITE INTO TABLE test_hive; 
Copying data from file:/home/hduser/input2.txt 
Copying file: file:/home/hduser/input2.txt 
Loading data to table default.test_hive 
Deleted hdfs://hydhtc227141d:54310/app/hive/warehouse/test_hive 
OK 
Time taken: 0.572 seconds 
hive> select * from test_hive; 
OK 
NULL NULL 
NULL NULL 
NULL NULL 
NULL NULL 
NULL NULL 
NULL NULL 
NULL NULL 
NULL NULL 
Time taken: 0.182 seconds 
+2

probabilmente è necessario specificare come righe/colonne siano definite in file di input durante il caricamento in una tabella Hive.Puoi provare qualcosa del tipo: 'crea tabella test_hive (id int, stringa valore) ROW FORMAT DELIMITED FIELDS TERMINATO DA '' STORED AS TEXTFILE LOCATION '/ user/hadoop/hive/input';' –

+0

Il problema che stai affrontando è perché nel tuo dati i campi sono separati da '' e durante la creazione della tabella non hai menzionato il delimitatore di campo. Quindi, se non si menziona il delimitatore di campo durante la creazione della tabella dell'alveare, per impostazione predefinita l'hive considera^A come delimitatore. Quindi per risolvere il problema, è possibile ricreare la tabella menzionando la sintassi di seguito e funzionerebbe. CREATE TABLE test_hive (id INT, valore STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ''; –

risposta

16

La terminazione del campo predefinito in Hive è^A. È necessario menzionare esplicitamente nell'istruzione della tabella create che si sta utilizzando un separatore di campo diverso.

Simile a quello che Lorand Bending sottolineato nel commento, utilizzare:

CREATE TABLE test_hive(id INT, value STRING) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '; 

Non è necessario specificare una posizione dal momento che si sta creando un tavolo gestito (e non una tabella esterna).

1

di Hive elenco di record e di campo predefiniti delimitatori:

  1. \ n

  2. ^A

  3. ^B

  4. ^C

premere^V^A potrebbe inserire un^A in Vim.

1

Gli elementi sono separati da spazio o tabulazione? Lascia che la sua scheda segua questi passaggi. Se lo spazio separato usa '' invece di '\ t' Ok.

hive> CREATE TABLE test_hive(id INT, value STRING) row format 
    delimited fields terminated by '\t' line formated by '\n' stored as filename; 

Che è necessario inserire

hive> LOAD DATA LOCAL INPATH '/home/hduser/input.txt' OVERWRITE INTO TABLE test_hive; 

hive> select * from test_hive; 

Ora si otterrà esattamente l'output "nomefile" previsto.

1

La soluzione è abbastanza semplice. Il tavolo non è stato creato nel modo giusto.

Soluzione semplice per il tuo problema o altri problemi è sapere come caricare i dati.

CREATE TABLE [IF non esiste] MyTableName (int id, string value)

formato di riga DELIMITATA

CAMPI terminato da '/ t'

memorizzati come TEXTFILE;

Ora lemme spiegare il codice:

  1. prima linea Creare il vostro tavolo. Il [SE NON ESISTE] è opzionale che indica se la tabella esiste non sovrascriverlo. È più di misura di sicurezza.

  2. Seconda riga Specifica un delimitatore a livello di tabella per i campi strutturati.

  3. Terzo elemento È possibile includere qualsiasi singolo carattere, ma il valore predefinito è '\ 001'. '/ t' è per un tab spazio: nel tuo caso '|' è per i dati che sono uno accanto all'altro e separati da | '' per uno spazio di carbone. E così via ...

  4. Forth Line: Specifica il tipo di file in cui devono essere memorizzati i dati. Il file può essere TEXTFILE, SEQUENCEFILE, RCFILE o SEQUENCEFILE BINARY. In alternativa, è possibile specificare il modo in cui i dati vengono archiviati come classi di input e output Java.

durante il caricamento sul Posto:

LOCD dati locali INPATH '/your/data/path.csv' [OVERWRITE] INTO TABLE MyTableName;

Provare sempre a verificare i dati con una semplice istruzione select *.

Spero che aiuti.

6

Il problema che si sta affrontando è perché nei dati i campi sono separati da "" e mentre si crea una tabella non si è menzionato il delimitatore di campo. Quindi, se non si menziona il delimitatore di campo durante la creazione della tabella dell'alveare, per impostazione predefinita l'hive considera^A come delimitatore.

Quindi per risolvere il problema, è possibile ricreare la tabella menzionando la sintassi di seguito e funzionerebbe.

CREATE TABLE test_hive(id INT, value STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ';

+0

Nell'esempio del client Apache HiveServer2 utilizzano un file delimitato "Ctrl-A" (a.txt) per caricare i dati nella tabella. Prima di tutto non includono questo file e in secondo luogo vorrei che fornissero maggiori informazioni a riguardo. – kostia

0

si prega di controllare la colonna di data set di dati che dovrebbe seguire il formato della data YYYY-MM-DD Se la stringa è nella forma 'YYYY-MM-DD', quindi un valore di data corrispondente a quello anno/mese/giorno viene restituito. Se il valore della stringa non corrisponde a questo formato, viene restituito NULL.

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-date

+0

@ B.Desai Grazie, ho appena seguito l'hive doc.please devo dare un'occhiata al link allegato –