向管理表中装载数据:
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 ';