Hive中没有行级别的插入,更新和删除操作。唯一向Hive中进行插入数据的方法是数据装载操作,或者通过其他方式将数据写入到正确的目录当中。
5.1向管理表中装载数据
load data [local] inpath 'path'
[overwrite] into table `tbl_name`
[partition(...)]
local: 表示为本地文件系统,将本地文件拷贝到分布式文件系统中
没有使用local则将数据移动到对应的文件夹下。
overwrite: 如果目标文件夹中有其他数据,那么会将其覆盖。
不使用该关键字的话,仅仅会把文件新增入目标文件夹。如果有同名文件的话,hive会将旧同名文件进行重新命名。以防止数据丢失。
5.2 通过查询语句向表中插入数据
insert [overwrite | into] table `tbl_name`
partition(...)
select_statement;
from `tbl_data_from` t
insert [into | overwrite] table `tbl_name`
partition(...)
select_statement
insert [into | overwrite] table `tbl_name`
partition(...)
select_statement
insert [into | overwrite] table `tbl_name`
partition(...)
select_statement
....
;
5.3 动态分区插入
Hive可以基于查询参数动态的推断出所需要创建的分区名称。 并且支持动态插入和静态插入进行混用,但是静态分区必须在动态分区字段之前。
insert overwirte table `tbl_name`
partition(k,..)
select_statement;
动态分区是默认关闭的,需要手动的打开。并且打开之后是默认在严格模式 下启动的,该模式下,进行分区插入时至少有一个是静态分区,这是为了防止一次创建大量的分区(在用户误操作的情况下,比如用户可能以时间戳作为动态分区,那么久惨了)。
属性 | default | 描述 |
---|
hive.exec.dynamic.partition | false | 是够开启动态分区 | hive.exec.dynamic.partition.mode | strict | nonstrict 表示是否允许所有分区都划分为动态 | hive.exec.max.dynamic.partition.pernode | 100 | 每个mapper和reducer可以创建的最分区的个数 | hive.exec.max.dynamic.partitions | 1000 | 每个动态分区语句可以创建的最大分区个数 | hive.exec.max.created.files | 100000 | 全局可以创建的最大分区个数 |
5.4 创建表并加载数据(不能用于外部表)
create table `tbl_name`
as
select_statement
5.5 导出数据
1.从文件系统中直接导出
hadoop fs -cp source_path target_path
2.使用insert…directory语句
insert overwrite local directory `local_path`
select_statement
|