举例说明,
现有本地文件,每行两列,内容如下:
0000000026310400 F
0000000029858520 F
0000000042620180 F
0000000044783820 F
0000000045771260 F
创建一个Hive表,使用如下语句:
create table if not exists new_table(id string, lable string);
加载本地文件到new_table,使用如下语句:
load data local inpath '~/new_file' overwrite into table new_table;
查询new_table内容,发现多了一个NULL列:
hive> select id, lable from new_table;
0000000026310400 F NULL
0000000029858520 F NULL
0000000042620180 F NULL
0000000044783820 F NULL
0000000045771260 F NULL
再查询第一个字段:
hive> select id from new_table;
0000000026310400 F
0000000029858520 F
0000000042620180 F
0000000044783820 F
0000000045771260 F
从查询结果中可以看出,本地文件每行的两列被当作一个字段加载到表中,但是表定义了两个字段,另一个字段没有数据,所以全是NULL。
分析原因,因为创建表的语句使用了Hive默认的SerDe存储格式,即序列化存储,默认是以'\001'作为字段分隔符,而本地文件new_file两列之间是以'\t'作为分隔符,所以文件中两列被当作一个字段了。
要去除NULL列,可以修改表new_table的字段分隔符,使用如下语句:
hive> alter table new_table set SERDEPROPERTIES('field.delim'='\t');
再次查询:
hive> select id, lable from new_table;
0000000026310400 F
0000000029858520 F
0000000042620180 F
0000000044783820 F
0000000045771260 F
hive> select id from new_table;
0000000026310400
0000000029858520
0000000042620180
0000000044783820
0000000045771260
表的内容正常了。
为避免出现以上问题,其实应该在定义表的时候就使用正确的字段分隔符,可使用如下语句:
create table if not exists new_table(id string, lable string) row format delimited fields terminated by '\t';