2012-11-14 33 views
12

將平面文件中的數據加載到配置單元表中時,我得到空值。
我的表結構是這樣的:將平面文件中的數據加載到配置單元表中時獲取空值

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

和我的平面文件是這樣的: input.txt中

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

當我運行下面的命令,我得到空值:

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 

截屏:

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

也許你需要指定如何行/列中輸入文件加載到一個蜂巢表時被分隔。您可以嘗試這樣的:'創建表test_hive(ID INT,字符串值)行格式分隔的字段TERMINATED BY「」存儲爲TEXTFILE LOCATION「/用戶/ Hadoop的/蜂房/輸入」;'你面對 –

+0

問題是因爲在你的數據的字段之間用''分隔,並且在創建表格時你沒有提到字段分隔符。因此,如果您在創建配置單元表時未提及字段分隔符,默認情況下,配置單元將^ A視爲分隔符。 因此,要解決您的問題,您可以重新創建表格提及下面的語法,它會工作。 CREATE TABLE test_hive(ID INT,值STRING) 行格式分隔字段TERMINATED BY'「; –

回答

16

Hive中的默認字段終止符是^ A。您需要在create table語句中明確提及您正在使用不同的字段分隔符。

什麼羅蘭彎曲的評論指出的一樣,使用方法:

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

你不需要指定位置,因爲你正在創建一個管理表(而不是外部表)。

1

蜂房的默認記錄和字段分隔符列表:

  1. \ n

  2. ^A

  3. ^B

  4. ^C

按^ V^A可以在Vim中插入^ A。

1

元素由空格或製表符分隔嗎?讓它的標籤遵循這些步驟。如果分開的空間使用''而不是'\ t'好吧。

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

比你要進入

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

hive> select * from test_hive; 

現在你會得到確切的預期輸出 「文件名」。

1

解決方案非常簡單。表格不會以正確的方式創建。

針對您的問題或任何其他問題的簡單解決方案是知道如何加載數據。

CREATE TABLE [IF NOT EXIST] mytableName(ID INT,值字符串)

ROW FORMAT DELIMITED TERMINATED BY '/ T'

存儲爲TEXTFILE;

現在還是讓我解釋一下代碼:

  1. 一線 創建你的表。 [IF NOT EXIST]是可選的,用於判斷表是否存在不覆蓋它。它更多的是安全措施。

  2. 第二行 在表級別爲結構化字段指定分隔符。

  3. 第三項 您可以包含任何單個字符,但默認爲'\ 001'。 '/ t'用於標籤空間:在你的情況下 '|'用於彼此相鄰且由|分隔的數據 ''爲一個char空間。等等......

  4. Forth行: 指定要在其中存儲數據的文件的類型。該文件可以是TEXTFILE,SEQUENCEFILE,RCFILE或BINARY SEQUENCEFILE。或者,如何存儲數據可以指定爲Java輸入和輸出類。

局部加載時:

LOCD DATA LOCAL INPATH '/your/data/path.csv'[覆蓋] INTO TABLE myTableName;

總是嘗試使用簡單的select *語句來檢查您的數據。

希望它有幫助。

6

您面臨的問題是因爲在您的數據中,字段之間用''分隔,創建表時您沒有提到字段分隔符。因此,如果您在創建配置單元表時未提及字段分隔符,默認情況下,配置單元將^ A視爲分隔符。

因此,要解決您的問題,您可以重新創建提及下面的語法的表,它會工作。

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

+0

在Apache HiveServer2客戶端示例中,他們使用「Ctrl-A」分隔文件(a.txt)將數據加載到表中。首先他們不包括這個文件,第二我希望他們在那裏提供更多的信息。 – kostia

相關問題