Hadoop之Hive数据的导入与导出(DML)
Posted 柳小葱
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hadoop之Hive数据的导入与导出(DML)相关的知识,希望对你有一定的参考价值。
上一张章节我们已经讲完了数据库和表的增删改查,感兴趣的小伙伴可以点这里: Hadoop之Hive数据库和表的增删改查(DDL).
本章节将要学习对数据操作的DML,主要包括数据的导入和导出,清除。
目录
1.数据导入
1.1向表中装载数据(load)
语法如下:
load data [local] inpath '数据的 path' [overwrite] into table student [partition (partcol1=val1,…)];
--load data:表示加载数据
--local:表示从本地加载数据到 hive 表;否则从 HDFS 加载数据到 hive 表
--inpath:表示加载数据的路径
--overwrite:表示覆盖表中已有数据,否则表示追加
--into table:表示加载到哪张表
--student:表示具体的表
--partition:表示上传到指定分区
- 导入数据
从本地导入数据(local)
--local表示数据在本机的系统中
load data local inpath '/opt/modul/hive/student.txt' into table student;
插入数据成功。
从HDFS上导入数据
我们将student数据放入根目录下,这样就在hdfs上了。
将该数据导入进student2表
load data inpath '/student.txt' into table student2;
导入成功:
我们发现根目录下的student.txt不见了
总结:在local导入数据是拷贝一份数据,而在hdfs上导入数据是剪切数据。
1.2 插入数据(insert)
- 基本插入数据
--插入一条数据
insert into student values ("1006","BANZ");
- 根据查询的结果插入
--将表student2查出的结果插入student中
insert into student select * from student2;
成功将student2表里的数据插入
- 覆盖前表(overwrite)
--例子的写法
insert overwrite table student_par
select id, name
from student where month='201709';
--将student表的内容覆盖(删除原来的添加新的)
insert overwrite table student select * from student2;
成功覆盖student表。
1.3 查询语句中创建表并加载数据(As Select)
- 这里是指创建表的同时,从加入数据(as select)
--创建表并添加数据
create table if not exists student3
as select id, name from student;
1.4 创建表时通过 Location 指定加载数据路径
- 允许先建立数据再建立表(默认路径)
先在默认路径建立一个文件夹student4,在存放数据
hadoop fs -mkdir /user/hive/warehouse/student4
cd /opt/modul/hive/
hadoop fs -put student.txt /user/hive/warehouse/student4
然后在数据里建表
create table student4(id string,name string) row format delimited fields terminated by '\\t';
建表自带数据
- 允许先建立数据再建立表(自定义路径)
我们在根目录建立一个文件夹studen5
hadoop fs -mkdir /student5
hadoop fs -put /opt/modul/hive/student.txt /student5
建表指定路径
create table if not exists student5 (id int, name string) row format delimited fields terminated by '\\t'
location '/student5';
建表成功,数据也存在。
通过location ‘/student5’ 即可指定数据的来源,但通常情况下来说,这种情况应该建立外部表,因为数据可能是其他人上载上来的,我们最好不要删除它。
2.数据导出
2.1 INSERT导出数据
导出表student2里面的数据到student文件夹
--导出表student2里面的文件到student文件夹
insert overwrite local directory '/opt/modul/hive/student'
select * from student2;
数据文集已导出到student文件夹下
导出表student2里面的数据到student文件夹并以逗号分隔
--导出表student2里面的文件到student文件夹但是指定文件以逗号分隔符
insert overwrite local directory
'/opt/modul/hive/student'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
select * from student2;
导出表student2里面的数据到未创建的文件夹(需要取消local)
--suudent2文件夹并不存在,但是该语句会帮我们创建,并将数据放入其中
insert overwrite directory
'/student2'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
select * from student2;
创建成功,文件也存在
通过hadoop命令直接下载
dfs -get /user/hive/warehouse/student2/student.txt
/student2.txt;
Hive Shell 命令导出
一个覆盖 ; >>两个追加
bin/hive -e 'select * from default.student2;' > /opt/module/hive/test.txt;
export命令导出
export 和 import 主要用于两个 Hadoop 平台集群之间 Hive 表迁移。
export table default.student2
to '/student';
export出的数据比普通导出的数据多了一个元数据文件,当导入该文件数据到其他地方时,需要用import
只有当student8不存在或者student8存在但是必须是空表
--将数据导入到student8中
import tabkle student8 from '/student';
导入成功
3.数据删除
Truncate 只能删除管理表中的数据,但表还在,这就是和drop的区别。不能删除外部表中数据,因为外部表连drop都不能删除HDFS上的数据,truncate肯定不能。
--删除表里面的数据
truncate table student;
数据存在,然后删除
删除后没了。
参考资料
《大数据Hadoop3.X分布式处理实战》
以上是关于Hadoop之Hive数据的导入与导出(DML)的主要内容,如果未能解决你的问题,请参考以下文章