我在将平面文件中的数据加载到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
答案 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的默认记录和字段分隔符列表:
\ n
^ A
^ B
^ C
按^ 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;
存储为文本文件;
现在解释代码:
第一行 创建你的表。 [IF NOT EXIST]是可选的,表示表格是否存在不覆盖它。它更多的是安全措施。
第二行 为结构化字段指定表级别的分隔符。
第三项 您可以包含任何单个字符,但默认值为&#39; \ 001&#39;。 &#39; /吨&#39;用于标签空间:在您的情况下 &#39; |&#39;用于彼此相邻并由|分隔的数据 &#39; &#39;一个char空间。等等......
Forth Line: 指定要存储数据的文件类型。该文件可以是TEXTFILE,SEQUENCEFILE,RCFILE或BINARY SEQUENCEFILE。或者,如何存储数据可以指定为Java输入和输出类。
在本地加载时:
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