向管理表中装载数据:

load data local inpath '/home/demo/data/' overwrite into table emp partition(state='CHN',city='BJ');

解析:

local 存在该关键字表示从linux本地目录,否则,从HDFS系统

inpath 后面添加的路径为一个目录,表示该目录下的所有数据

overwrite 存在表示删除原有的数据,不存在表示新增数据


通过查询语句向表中插入数据:

insert overwrite table emp
partition(state='CHN',city='BJ')
select * from state_emps se where se.state='CHN' and se.city='BJ';


在分区数据比较多的情况下,Hive提供了另外一种Insert语法,可以只扫描一次输入数据:


from state_emps se
insert overwrite table emp
   partition(state='CHN',city='BJ')
   select *  where se.state='CHN' and se.city='BJ';
insert overwrite table emp
   partition(state='CHN',city='SH')
   select *  where se.state='CHN' and se.city='SH ';
insert overwrite table emp
   partition(state='CHN',city='CQ')
   select *  where se.state='CHN' and se.city='CQ ';


动态分区插入:

如果需要创建非常多的分区,此时用户就需要写非常多的SQL,不过幸运的是,Hive提供了一个动态分区的功能,其可以基于查询参数推断出需要创建的分区名称,相比之下,之前我们创建的分区都是静态分区。

insert overwrite table emp 
partition(state,city)
select app_name,mee,...,se.ste,se.cy
from state_emps se ;

Hive根据select语句中最后2列来确定分区字段state,city的值。假设state_emps中共有100个省和市的话,指向上述查询以后,emp将会有100个分区。


用户也可以混合使用动态和静态分区,如下指定state字段的值为静态的CHN,而分区的字段city是动态值:

insert overwrite table emp 
partition(state='CHN',city)
select app_name,mee,...,se.ste,se.cy
from state_emps se
where se.ste='CHN' ;

静态分区必须放置在动态分区之前。


动态分区默认情况下没有开启。开启后,默认是以"严格"模式执行的,在这种模式下要求至少有一列分区字段是静态的。这有助于阻止因设计错误导致查询产生大量的分区。

动态分区相关属性如下:

属性名称                                                          缺省值           描述

hive.exec.dynamic.partition                            false         设置true,表示开启动态分区功能

hive.exec.dynamic.partition.mode                 strict         若为nonstrict,表示允许所有分区都是动态的

hive.exec.max.dynamic.partitions.permode   100          每个mapper或reducer可以创建的最大动态分区个数

hive.exec.max.dynamic.partitions                   1000        一个动态分区语句可以创建的最大动态分区个数

hive.exec.max.created.files                             100000    全局可以创建的最大文件个数


导出数据:

如果数据文件恰好是用户需要的格式,那么只需要简单的拷贝文件夹或文件就可以了:

hadoop fs -cp source_path dest_path

否则,用户可以使用insert...directory...

insert overwrite local directory '/home/demo/data'

select * from emp where state='CHN' and city='HF';

注意:

我们可以再Hive CLI中查看结果文件内容:

hive>! ls /home/demo/data ;
000000_0
hive>! cat /home/demo/data/000000_0 ;


和向表中插入数据一样,用户也可以通过如下方式指定多个输出文件夹目录:

from state_emps se
insert overwrite directory '/home/demo/data'
   select *  where se.state='CHN' and se.city='BJ';
insert  overwrite directory '/home/demo/data'
   select *  where se.state='CHN' and se.city='SH ';
insert  overwrite directory '/home/demo/data'
   select *  where se.state='CHN' and se.city='CQ ';