使用load data形式导入数据
总结
测试案例
从linux上正常load data
从HDFS上正常 load data
普通表指定分区的情况下load data
分区表未指定分区的情况下load data
字段缺少的情况下load data
字段过多的情况下load data
字段类型不一致的情况下load data
这里我们重点关注在HIVE中使用load data形式导入数据可能出现的一些情况。避免踩坑。
总结
这里我们根据实际情况作出一些总结,并针对不同的情况进行简单测试。
使用load data形式往hive表中装载数据时,如果使用关键字local,表示从本地文件系统中导入,这里是文件被拷贝到HDFS上。
使用load data形式往hive表中装载数据时,如果不使用关键字local,表示从HDFS文件系统中导入,这里是文件的移动。
使用load data形式往hive表中装载数据时,如果使用关键字overwrite,表示执行数据覆盖操作,原有数据会被全部覆盖(如果是分区表,则覆盖指定分区)。
使用load data形式往hive表中装载数据时,如果不使用关键字overwrite,表示执行数据追加操作,原有数据不会被覆盖。
使用load data形式往hive表中装载数据时,不会检查字段类型,如果字段类型不一致,使用null值填充。如果字段过多则会丢弃,缺失则会使用null值填充。
测试案例
下面是具体实现以及简单测试。
先新建两张测试表test_01和test_02,其中test_01为普通表,test_02为分区表。
CREATE TABLE IF NOT EXISTS `test_01`(
`id` STRING,`name` STRING,`age` INT,`score` FLOAT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE;
CREATE TABLE IF NOT EXISTS `test_02`(
`id` STRING,`name` STRING,`age` INT,`score` FLOAT)
PARTITIONED BY (`dataday` STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE;
这里分情况分别进行测试
从linux上正常load data
测试数据a.txt
[root@nd2 wh]# cat a.txt
1,lucy,20,90
2,Marry,21,95
3,Tom,22,100
这里我们将a.txt文件内容分别导入到test_01和test_02表中
--使用overwrite覆盖操作
hive> load data local inpath '/usr/wh/a.txt' overwrite into table test_01;
hive> select * from test_01;
1 lucy 20 90.0
2 Marry 21 95.0
3 Tom 22 100.0
--这里我们不使用overwrite,数据会被直接追加
hive> load data local inpath '/usr/wh/a.txt' into table test_01;
hive> select * from test_01;
1 lucy 20 90.0
2 Marry 21 95.0
3 Tom 22 100.0
1 lucy 20 90.0
2 Marry 21 95.0
3 Tom 22 100.0
--再次使用overwrite 验证数据是否被覆盖
hive> load data local inpath '/usr/wh/a.txt' overwrite into table test_01;
hive> select * from test_01;
1 lucy 20 90.0
2 Marry 21 95.0
3 Tom 22 100.0
--导入分区表需要指定分区
hive> load data local inpath '/usr/wh/a.txt' overwrite into table test_02
partition (dataday='20190501');
hive> select * from test_02;
1 lucy 20 90.0 20190501
2 Marry 21 95.0 20190501
3 Tom 22 100.0 20190501
从HDFS上正常 load data
测试数据a.txt
[root@nd2 wh]# hadoop fs -cat /wh/test/a.txt
1,lucy,20,90
2,Marry,21,95
3,Tom,22,100
这里我们将a.txt文件内容分别导入到test_01和test_02表中
hive> load data inpath 'hdfs://nameservice1/wh/test/a.txt' overwrite into table test_01;
hive> select * from test_01;
OK
1 lucy 20 90.0
2 Marry 21 95.0
3 Tom 22 100.0
--需要注意的是,从HDFS上导入数据到HIVE表,此处是文件的移动,所以这里我们需要重新放一份文件到HDFS上
--[root@nd2 wh]# hadoop fs -ls /wh/test/
--[root@nd2 wh]# hadoop fs -put a.txt /wh/test/
hive> load data inpath 'hdfs://nameservice1/wh/test/a.txt' overwrite into table test_02 partition (dataday='20190501');
hive> select * from test_02;
1 lucy 20 90.0 20190501
2 Marry 21 95.0 20190501
3 Tom 22 100.0 20190501
普通表指定分区的情况下load data
这里我们将a.txt文件内容导入到test_01,这里直接报错
hive> load data local inpath '/usr/wh/a.txt' overwrite into table test_01 partition (dataday='20190501');
FAILED: ValidationFailureSemanticException table is not partitioned but partition spec exists: {dataday=20190501}
分区表未指定分区的情况下load data
这里我们将a.txt文件内容导入到test_01,这里直接报错
hive> load data local inpath '/usr/wh/a.txt' overwrite into table test_02;
FAILED: SemanticException [Error 10062]: Need to specify partition columns because the destination table is partitioned
字段缺少的情况下load data
测试数据b.txt
[root@nd2 wh]# cat b.txt
1,lucy,20
2,Marry,21
3,Tom,22
这里我们将a.txt文件内容导入到test_01
hive> load data local inpath '/usr/wh/b.txt' overwrite into table test_01;
hive> select * from test_01;
1 lucy 20 NULL
2 Marry 21 NULL
3 Tom 22 NULL
字段过多的情况下load data
测试数据c.txt
[root@nd2 wh]# cat c.txt
1,lucy,20,90,aa
2,Marry,21,95,bb
3,Tom,22,100,cc
这里我们将c.txt文件内容导入到test_01
hive> load data local inpath '/usr/wh/c.txt' overwrite into table test_01;
hive> select * from test_01;
1 lucy 20 90.0
2 Marry 21 95.0
3 Tom 22 100.0
字段类型不一致的情况下load data
测试数据d.txt
[root@nd2 wh]# cat d.txt
1,lucy,aa,bb
2,Marry,cc,dd
3,Tom,xx,yy
这里我们将d.txt文件内容导入到test_01
hive> load data local inpath '/usr/wh/d.txt' overwrite into table test_01;
hive> select * from test_01;
1 lucy NULL NULL
2 Marry NULL NULL
3 Tom NULL NULL