假设要插数据表为users,数据表为temp_users, 数据文件为users.csv
1. 向表中装载数据
load data local inpath '/temp/data/root/users.csv' overwrite into table users
partition (age=18)
注:如果分区不存在的话,这个命令会先创建分区,再把数据拷贝到users表对应的目录下。另外Hive不会验证用户装载的数据和表的模式是否匹配,但会验证文件格式是否和表结构的定义一致。例如表在创建时定义存储格式为textfile,那么装载表里的文件也应该是textfile格式。
2. 通过查询语句往表中插入数据
// 第一种
insert overwrite table users
partition (age=20)
select * from temp_users tu
where tu.age=20;
// 第二种
from temp_users
insert overwrite table users
partition (age=18)
select * where tu.age=18
insert overwrite table users
partition (age=19)
select * where tu.age=19
insert overwrite table users
partition (age=20)
select * where age=20;
// 第三种(动态分区插入)
insert overwrite table users
partition (age)
select tu.name, tu.gender, tu.age
from temp_users tu;
注:上述第三种方式中,在进行动态分区插入时,源表字段值和输出分区值之间的关系是根据位置而不是根据命名来匹配的。而且也可以混合使用静动态分区,但静态分区键一定在动态分区键之前。
3. 单个查询语句创建并加载数据
create table users
as select name, gender, age
from temp_users tu
where tu.age>18;
注:这只能创建一张内表
4. 导出数据
// 第一种
insert overwrite local directory '/temp/data/users'
select name, gender, age
from users u
where u.age>18;
// 第二种
from table users u
insert overwrite local directory 'temp/data/users_18'
select * where u.age=18
insert overwrite local directory 'temp/data/users_19'
select * where u.age=19
insert overwrite local directory 'temp/data/users_20'
select * where u.age=20;
注:上述命令中的路径可以写成全URL路径,如'hdfs://localhost/temp/data/users'
附:
动态分区属性
属性名 | 缺省值 | 描述 |
---|---|---|
hive.exec.dynamic.partition | false | 设为true表示开启动态分区功能 |
hive.exec.dynamic.partition.mode | strict | 设置成nonstrict表示允许所有的分区都为动态 |
hive.exec.max.dynamic.partitions.pernode | 100 | 表示每个mapper或reducer可以创建的最大动态分区数 |
hive.exec.max.dynamic.partitions | +1000 | 一个动态分区语句可以创建的最大动态分区个数 |
hive.exec.max.created.files | 100000 | 全局可以创建的最大文件个数 |
例子:
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table users
partition (age)
select tu.name, tu.gender, tu.age
from temp_users tu;
网友评论