在将平面文件中的数据加载到配置单元表时获取空值

时间:2012-11-14 12:59:49

标签: hadoop null hive hdfs flat-file

我在将平面文件中的数据加载到hive表时获取空值 我的表结构是这样的:

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

6 个答案:

答案 0 :(得分:19)

Hive中的默认字段终止符是^ A.您需要在create table语句中明确提到您正在使用不同的字段分隔符。

与Lorand Bending在评论中指出的相似,使用:

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

您不需要指定位置,因为您正在创建托管表(而不是外部表)。

答案 1 :(得分:6)

您面临的问题是因为在您的数据中,字段由&#39;分隔。 &#39;在创建表时,您没有提到字段分隔符。因此,如果您在创建hive表时没有提及字段分隔符,则默认情况下,hive会将^ A视为分隔符。

因此,为了解决您的问题,您可以重新创建提及以下语法的表格,它可以正常工作。

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

答案 2 :(得分:1)

Hive的默认记录和字段分隔符列表:

  1. \ n

  2. ^ A

  3. ^ B

  4. ^ C

  5. 按^ V ^ A可以在Vim中插入^ A.

答案 3 :(得分:1)

元素是用空格还是标签分隔的?让它的标签按照这些步骤操作。如果分隔空间使用&#39; &#39;而不是&#39; \ t&#39;好。

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;

现在,您将获得准确的预期输出&#34; filename&#34;。

答案 4 :(得分:1)

解决方案非常简单。表格以正确的方式创建。

解决您的问题或任何其他问题的简单方法是了解如何加载数据。

  

CREATE TABLE [IF NOT EXIST] mytableName(id int,value string)

     

ROW FORMAT DELIMITED

     

终止于&#39; / t&#39;

     

存储为文本文件;

现在解释代码:

  1. 第一行 创建你的表。 [IF NOT EXIST]是可选的,表示表格是否存在不覆盖它。它更多的是安全措施。

  2. 第二行 为结构化字段指定表级别的分隔符。

  3. 第三项 您可以包含任何单个字符,但默认值为&#39; \ 001&#39;。 &#39; /吨&#39;用于标签空间:在您的情况下 &#39; |&#39;用于彼此相邻并由|分隔的数据 &#39; &#39;一个char空间。等等......

  4. Forth Line: 指定要存储数据的文件类型。该文件可以是TEXTFILE,SEQUENCEFILE,RCFILE或BINARY SEQUENCEFILE。或者,如何存储数据可以指定为Java输入和输出类。

  5. 在本地加载时:

      

    LOCD DATA LOCAL INPATH&#39; /your/data/path.csv' [OVERWRITE] INTO TABLE myTableName;

    始终尝试通过简单的select *语句检查数据。

    希望它有所帮助。

答案 5 :(得分:1)

请检查数据集日期列,它应遵循日期格式yyyy-mm-dd 如果字符串的格式为'yyyy-mm-dd',则返回与该年/月/日相对应的日期值。如果字符串值与此格式不匹配,则返回NULL。 Hive Official documentation