1. 数据导入
1.1 使用 HIve 命令 导入数据
1.1.1 load :将【文件数据】导入表 (官方推荐) ⭐
官方推荐:先清洗数据成为结构化文件,再使用Load语法加载数据到表中。这样的效率更高。
load data [local] inpath '数据的path' [overwrite]
into table 表名 [partition (partcol1=val1,...)];
local
:如果加该字段表示从本地加载数据到表,不加就表示从HDFS加载数据到表。这个本地是指:Hiveserver2服务所在主机的文件系统,不是Hive客户端所在的本地文件系统。inpath
:数据的路径。① 可以写绝对路径;②也可以写相对路径;③ 还可以是URI,如hdfs://namenode:9000/user/hive/project/data1
overwrite
:是否覆盖表中数据partition
:指定加载到哪个分区。
注意:
- 从本地上传到hdfs:是复制,不是剪切。因为本质是
hadoop dfs -put
- 从hdfs到hdfs:是剪切,不是复制。因为本质是
hadoop dfs -mv
1.1.2 insert:将【查询数据】导入表 (hive3.0新特性) ⭐
(1) insert + values:一次插入一条数据 (不推荐)
可以像MySQL使用insert+values
一条一条直接插入数据,但是执行过程非常非常慢,原因在于底层是使用MapReduce把数据写入Hive表中。【不推荐】
-- 全部字段
insert into table t_test
values (1,"allen",18);
-- 可以选择插入部分字段
insert into table employees (name, age)
values ('Alice', 18);
(2) insert + select :一次插入多条数据 ⭐
先将数据清洗成为结构化文件,然后使用load命令将文件数据导入到一个原始表中,最后使用insert+select
将原始表中多条数据一次导入到表中。【推荐】
- 语法:
-- 全部字段 INSERT INTO|OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select 全部字段 FROM from_statement; -- 部分字段 INSERT INTO|OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] (字段1,字段2) select 字段1,字段2 FROM from_statement;
into
是追加的写入overwrite
是覆盖的写入
- 例子:
--创建一张原始表student drop table if exists student; create table student( num int, name string, sex string, age int, dept string ) row format delimited fields terminated by ','; --将数据加载到原始表中 load data local inpath '/root/hivedata/students.txt' into table student; --创建一张目标表 create table student_from_insert(sno int,sname string); --使用insert+select插入数据到新表中 insert into table student_from_insert select num,name from student; -- 查看数据是否插入成功 select * from student_from_insert;
(3) from + insert + select :一次扫描多次插入⭐
-
功能:减少扫描的次数,在一次扫描中。完成多次insert操作。
--当前库下已有一张表student select * from student; --创建两张新表 create table student_insert1(sno int); create table student_insert2(sname string); --一次扫描,两次插入 from student insert overwrite table student_insert1 select num insert overwrite table student_insert2 select name;
(4) insert + partition + select:动态分区插入 ⭐
- 将查询数据导入到分区表中
--1、开启动态分区并指定模式 set hive.exec.dynamic.partition = true; -- 开启动态分区 -- ① strict:值为strict表示为严格模式,那么插入数据并指定分区字段时必须有一个分区字段值静态指定。 -- ② nonstrict:如果想要插入数据并指定分区字段时每个分区字段都自动指定值,那么使用非严格模式 set hive.exec.dynamic.partition.mode = nonstrict; --2、当前库下已有一张表student select * from student; --3、创建分区表 以sdept作为分区字段 create table student_partition( Sno int, Sname string, Sex string, Sage int ) partitioned by(sdate timestamp, sdept string); --4、执行动态分区插入操作 insert into table student_partition partition(sdate='2008-06-08', sdept) select num,name,sex,age,dept from student; -- insert语句中 -- 分区字段 sdate='2008-06-08' 值直接显示给出,故是静态分区 -- 分区字段 sdept没有显示给出,故是动态分区 -- select语句中 --其中,num,name,sex,age作为表的字段内容插入表中 --因为只有一个动态分区字段,那么select到的字段列表的倒数第一个字段dept的值是做为分区字段值 -- 5. 查看数据是否插入成功 select * from student_partition
1.1.3 creat + as select:创建表时将查询数据导入
create table if not exists student6
as select id,name from student1;
1.2 使用Hadoop 命令 导入数据
-
方式一:使用Hadoop命令将数据导入到hdfs中:
# 打开Linux终端,在任何地方输入: [hao@hadoop111 ~]$ hadoop dfs -put 文件1路径 文件2路径 文件3路径 hdfs路径
-
方式二:使用web图形化界面将数据导入到hdfs中:
注意:从hdfs中导入数据,只是导入真实数据,要与hive的元数据保持一致才能使用。若不一致,则查询不到数据
但可以使用语法进行修复:分区表的分区修复
2. 数据导出
2.1 使用 HIve 命令 导出数据
2.1.1 insert:将查询结果导出 ⭐
(1) insert + select :一次导出多条数据 ⭐
-
语法:
INSERT OVERWRITE [LOCAL] DIRECTORY ‘文件夹路径’ [ROW FORMAT row_format] -- 指定分隔符 [STORED AS file_format] -- 指定存储格式 SELECT ... FROM ...
注意:
- 导出操作是一个OVERWRITE覆盖文件夹操作,子文件都会被覆盖,慎重
local
:如果加该字段表示将数据下载到本地,不加就表示下载到hdfs。这个本地是指:Hiveserver2服务所在主机的文件系统,不是Hive客户端所在的本地文件系统。- 不指定分隔符,则默认以
\001
即SOH
分隔字段。
-
例子:
--当前库下已有一张表student select * from student; --1、导出查询结果到HDFS指定目录下 insert overwrite directory '/tmp/hive_export/e2' row format delimited fields terminated by ',' stored as orc select * from student; --2、导出数据到本地文件系统指定目录下 insert overwrite local directory '/root/hive_export/e1' select * from student;
(2) from + insert + select :一次扫描多次导出 ⭐
-
语法:在
insert + select
基础上,将from...
提前即可from table_name INSERT OVERWRITE [LOCAL] DIRECTORY ‘文件夹路径’ [ROW FORMAT row_format] -- 指定分隔符 [STORED AS file_format] -- 指定存储格式 INSERT OVERWRITE [LOCAL] DIRECTORY ‘文件夹路径’ [ROW FORMAT row_format] -- 指定分隔符 [STORED AS file_format] -- 指定存储格式 SELECT ...
-
例子:
from student insert overwrite directory '/tmp/hive_export/e2' row format delimited fields terminated by ',' stored as orc select name from student; insert overwrite directory '/tmp/hive_export/e3' row format delimited fields terminated by ',' select age from student;
2.1.2 export:将表数据导出 ⭐
-
导出到hdfs:
export table default.student to '/student';
export
导出来的文件:_metadata
文件:存放表的元数据data
文件夹:存放表的数据文件
export
和import
主要用于两个 Hadoop 平台集群之间的 Hive 表迁移。
2.2 使用Hadoop 命令 导出数据
-
使用命令从hdfs中导出数据:从hdfs中拉取数据到输入命令的Linux这台主机上:
# 打开Linux终端,在任何地方输入: [hao@hadoop111 ~]$ hadoop dfs -get hdfs文件1路径 hdfs文件2路径 本地路径
-
使用web图形化界面从hdfs中导出数据:从hdfs中拉取数据到打开web图形化界面的主机(一般是window)
注意:从hdfs中导出数据,只是导出真实数据,并没有导出元数据
2.3 Sqoop导出
Sqoop
是一个工具,这个后期有专门的blog学习该工具怎么使用,这里不再赘述