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

你可能感兴趣的:(Hive)