使用load data导入数据到普通表和分区表的区别
使用load data形式导入数据总结测试案例从linux上正常load data从HDFS上正常 load data普通表指定分区的情况下load data分区表未指定分区的情况下load data字段缺少的情况下load data字段过多的情况下load data字段类型不一致的情况下load data这里我们重点关注在HIVE中使用load data形式导入数据可能出现的一些情况。避免踩坑。
使用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
更多推荐
所有评论(0)