Hive(3) DML语句
DML 数据操作语句
导入数据
直接从文件向表中导入数据(load data)
load data [local] inpath <文件路径> [overwrite]
into table <表名>
[partition (<分区名> = <值>, ...)]
说明
- local : 如果加上local, 就是本地文件上传, 如果不加, 就是HDFS文件上传
- overwrite : 如果加上该属性, 就把原先的表中数据全部清除, 然后再加入新数据, 如果不加该属性, 就是在原来数据的基础上追加数据
- partition (<分区名> = <值>, …) : 表示上传到哪个分区
注意
本地上传的话, 文件依旧存在(复制), 但是如果是HDFS上传, 原本的文件就不存在了(移动)
insert 语句
insert into <表名>
values(<值列表1>) (<值列表2>) ... ;
注意
1.
insert
不支持插入部分字段, 即不像MySQL中指定部分字段然后插入部分字段的值2. 因为Hive现将逻辑翻译为MapReduce, 然后再执行, 所以一般不这么写, 因为效率太慢, 一般使用
insert
语句, 都是从一个表中向另一个表中导入数据, 见下面
通过查询向表中插入数据
insert [overwrite] table <表名>
partition(<分区字段> = <值>)
select <字段列表>
from <表名2>
where <条件> ;
也可以先写from
, 这样可以同时向多张表或多个分区中插入数据
from <表名2>
insert [overwrite] table <表名1> partition(<分区字段> = <值>)
select <字段列表> where <条件>
insert [overwrite] table <表名2> partition(<分区字段> = <值>)
select <字段列表> where <条件>
通过查询创建一个新表
create table [if noe exists] <新表名>
as select <字段列表>
from <旧表名>
... ;
举例 创建一个学生表表, 从班级表中导入数据
create external table if not exists 学生表(
学生ID int,
姓名 string
)
as select 学生, 姓名 from 班级表;
直接使用location指定加载的数据路径
如果我们想要加载某个文件路径下的数据, 又知道某个文件在hdfs中的路径, 可以创建一个表, 直接指定该文件的路径就可以
create external table [if not exists] <表名>(
<字段, 属性列表>
)
row format <分割形式>
localtion <文件路径>;
举例 将/student/
目录下的文件映射成一张外部表
create external table if not exists student5(
id int, name string
)
row format delimited fields terminated by '\t'
location '/student;
import
使用import
命令, 将之前导出的备份文件导入
import table <表名>
[partition(<分区名> = <值>)]
form <目录路径>
注意
使用import导入, 只能导入之前导出的表, 不能导入一个没有元数据的目录作为一个表
数据导出
insert 导出
insert overwrite [local] directory <输出路径>
[row format delimited fields terminated by '<分隔符>']
<select 语句> ;
说明
- local : 如果添加local就是导出到本地, 如果不加就是导出到HDFS中
- row format : 将导出结果格式化, 如果不指定, 默认使用 ‘\t’
使用Hadoop命令导出
这种方法说白了就是使用HDFS命令下载表文件到本地
dfs -get <HDFS下的表文件路径> <本地文件路径>;
使用Hive Shell命令导出
使用hive shell需要在在Hive 的bin目录下执行, 如果配置了Hive 的全局环境变量, 可以在任意目录下执行
hive -e '<select语句>' <导出到本地的文件路径>;
export
使用export
指令导出, 会连整张表的元数据和详细信息一并导出, 如果以后需要加载这部分内容, 直接使用import
语句就可以完整的加载整张表
export table <数据库名.表名> to <本地文件路径>;
使用sqoop
需要单独安装和学习sqoop
清空数据
truncate table <表名>;
注意
同
drop
语句不同,truncate
只会清楚表中所有的行, 但是不会删除这张表