1. 内部表、外部表的数据导入
1)load方式进行数据的导入
local :加local代表是从本地(客户端所在本地)导入的,不加的话表示从hdfs导入数据。
① 本地数据导入
外部表不支持 overwrite
load data local inpath '本地路径' [overwrite] into 表名;
这种方式的本质相当于将数据文件上传到了hdfs的hive表的目录底下。(只要hive管理的目录下有数据,都可以被表识别到)
注意:建表手动指定的目录,不同的表一定要指向不同的目录,除非多个表关联同一份数据
② HDFS数据导入
load data inpath '/cds/cs/...' into table 表名。
移动的过程,从hdfs的原始目录移动到hive表存储的hdfs的目录下。
hive的表就是hdfs的一个目录的管理者
2)insert 的方式进行数据插入
① 单条数据插入
insert into table 表名 values(xxx);
先将数据插入到一个临时表中,再将临时表的数据放到需要插入的表中
② 单重数据插入
每次插入多条,每次插入的是一个查询语句的结果
insert into table 表名 select xxx from xxx;
③ 多重插入(对表扫描一次,将数据插入到多个不同的表|分区中)
from 表名
insert into table 表名 select * where ...
insert into table 表名 select * where ...
优化:能使用多重插入的时候,不适用单重插入,能使用单重插入的时候,不使用单条插入。
2.分区表的数据导入
1) 静态分区数据导入
导入的时候需要指定分区名的,分区名手动指定的,写死的名
load方式
:(该方式插入分区表数据的时候,不会进行数据检查的,该方式,只会解析前几个字段,分区字段不会被解析,在加载数据的时候,会先创建这个分区)
load data local inpath '' into xxx partition(分区字段='分区名');
注:一定要注意十分确定数据就是这个分区的
insert方式
:(可以进行数据校验)----推荐(该方式在进行数据插入的时候一定注意字段对应)
insert into table xxx partition() values();
insert into table xxx partition() select xxx from xxx;
from xxx
insert into table xxx partition() select xxx where xxx;
多重数据插入:对原始表值扫描一次,但是可以将数据插入到多个分区中。
2) 动态分区数据导入
分区名不是手动指定的,而是根据数据自己生成的
开启动态分区:
set hive.exec.dynamic.partition.mode=nonstrict
insert into table xxx partition(分区字段) select xxxx;
这种当时分区字段没有手动指定,而是根据后面的查询语句来的,所以构面的查询语句必须要把分区字段查询出来。
这种方式是根据查询的分区字段的结果自动生成的分区
3.分桶表的数据导入
分桶表的数据导入只支持insert方式,load方式不支持
insert into table xxx select * from xxx;
运行的过程中启动了对应桶数个reducetask(几个桶对应几个reducetask)
注意:
hive 1.x中reducetask默认只启动一个,需要手动设置
set mapreduce.job.reduces=3
hive 2.x中 mapreduce.job.reduces=-1,即按照实际需求设定。