在将数据从平面文件加载到配置单元表时,我得到了null值
我的表格结构如下:
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
Hive中的默认字段终止符是^A。您需要在createtable语句中明确提到您正在使用不同的字段分隔符。
与Lorand Bending在评论中指出的类似,使用:
CREATE TABLE test_hive(id INT, value STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ';
您不需要指定位置,因为您创建的是托管表(而不是外部表)。
您面临的问题是,在数据中,字段用"分隔,并且在创建表时没有提及字段分隔符。因此,如果在创建配置单元表时没有提及字段分隔符,默认情况下,配置单元会将^A视为分隔符。
因此,为了解决您的问题,您可以重新创建提及以下语法的表,它就会起作用。
CREATE TABLE test_hive(id INT, value STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ';
解决方案非常简单。表的创建方式不对。
解决您的问题或任何其他问题的简单方法是知道如何加载数据。
CREATE TABLE[IF NOT EXIST]mytableName(id int,value string)
行格式分隔的
字段由"/t"终止
存储为文本文件;
现在让我解释一下代码:
-
第一行正在创建表。[IF NOT EXIST]是可选的,告诉如果表存在,不要覆盖它。它更多的是安全措施。
-
第二行在表级别为结构化字段指定分隔符。
-
第三项可以包含任何单个字符,但默认值为"\001"。"/t"表示选项卡空间:在您的情况下"|"表示并排的数据,用|"表示一个字符空间。等等…
-
第四行:指定要在其中存储数据的文件类型。该文件可以是TEXTFILE、SEQUENCEFILE、RCFILE或BINARY SEQUENCEFILE。或者,可以将数据的存储方式指定为Java输入和输出类。
本地加载时:
LOCAL INPATH'/your/DATA/path.csv'[OVERWRITE]进入表格myTableName;
始终尝试通过简单的select*语句检查数据。
希望能有所帮助。
Hive的默认记录和字段分隔符列表:
-
\n
-
^
-
^B
-
^C
按^V^A可以在Vim中插入^A。
元素用空格还是制表符分隔?让它的选项卡按照以下步骤操作。如果分隔的空格使用"而不是"\t\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;
现在,您将获得确切的预期输出"filename"。
请检查数据集日期列,它应该遵循日期格式yyyy-mm-dd如果字符串的格式为"yyyy-mm-dd",则返回与该年/月/日对应的日期值。如果字符串值与此格式不匹配,则返回NULL。Hive官方文档