文章目录

  • 1. 数据导入
  • 1.1 在hive客户端导入
  • 1.1.1 load :将文件数据导入表 (官方推荐) ⭐
  • 1.1.2 insert:将查询数据导入表 (hive3.0新特性) ⭐
  • (1) insert + values:一次插入一条数据 (不推荐)
  • (2) insert + select :一次插入多条数据 ⭐
  • (3) from + insert + select :一次扫描多次插入⭐
  • (4) insert + partition + select:动态分区插入 ⭐
  • 1.1.3 creat + as select:创建表时将查询数据导入
  • 1.2 使用Hadoop导入
  • 2. 数据导出
  • 2.1 在hive客户端中导出
  • 2.1.1 insert:将查询结果导出 ⭐
  • (1) insert + select :一次导出多条数据 ⭐
  • (2) from + insert + select :一次扫描多次导出 ⭐
  • 2.1.2 export:将表数据导出 ⭐
  • 2.2 使用Hadoop导出
  • 2.3 Sqoop导出


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:指定加载到哪个分区。

注意:

  1. 从本地上传到hdfs:是复制,不是剪切。因为本质是hadoop dfs -put
  2. 从hdfs到hdfs:是剪切,不是复制。因为本质是hadoop dfs -mv

1.1.2 insert:将查询数据导入表 (hive3.0新特性) ⭐

(1) insert + values:一次插入一条数据 (不推荐)

可以像MySQL使用insert+values一条一条直接插入数据,但是执行过程非常非常慢,原因在于底层是使用MapReduce把数据写入Hive表中。【不推荐】

--hive中insert+values
insert into table t_test 
values(1,"allen",18);
(2) insert + select :一次插入多条数据 ⭐

先将数据清洗成为结构化文件,然后使用load命令将文件数据导入到一个原始表中,最后使用insert+select将原始表中多条数据一次导入到表中。【推荐】

  1. 语法:
INSERT INTO|OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]]
select_statement1 FROM from_statement;
  1. into是追加的写入
  2. overwrite 是覆盖的写入
  1. 例子:
--创建一张原始表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导入

  1. 方式一:使用Hadoop命令将数据导入到hdfs中:
# 打开Linux终端,在任何地方输入:
[hao@hadoop111 ~]$ hadoop dfs -put 文件1路径 文件2路径 文件3路径 hdfs路径

hive数据导出到excel hive数据导入导出_hive

  1. 方式二:使用web图形化界面将数据导入到hdfs中:

注意:从hdfs中导入数据,只是导入真实数据,要与hive的元数据保持一致才能使用。若不一致,则查询不到数据
但可以使用语法进行修复:分区表的分区修复

2. 数据导出

2.1 在hive客户端中导出

2.1.1 insert:将查询结果导出 ⭐

(1) insert + select :一次导出多条数据 ⭐
  1. 语法:
INSERT OVERWRITE [LOCAL] DIRECTORY ‘文件夹路径’
[ROW FORMAT row_format] -- 指定分隔符
[STORED AS file_format] -- 指定存储格式
SELECT ... FROM ...

注意:

  1. 导出操作是一个OVERWRITE覆盖文件夹操作,子文件都会被覆盖,慎重
  2. local:如果加该字段表示将数据下载到本地,不加就表示下载到hdfs。这个本地是指:Hiveserver2服务所在主机的文件系统,不是Hive客户端所在的本地文件系统。
  3. 不指定分隔符,则默认以\001SOH分隔字段。
  1. 例子:
--当前库下已有一张表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 :一次扫描多次导出 ⭐
  1. 语法:在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 ...
  1. 例子:
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文件夹:存放表的数据文件

exportimport 主要用于两个 Hadoop 平台集群之间的 Hive 表迁移。

2.2 使用Hadoop导出

  1. 使用命令从hdfs中导出数据:从hdfs中拉取数据到输入命令的Linux这台主机上:
# 打开Linux终端,在任何地方输入:
[hao@hadoop111 ~]$ hadoop dfs -get hdfs文件1路径 hdfs文件2路径 本地路径
  1. 使用web图形化界面从hdfs中导出数据:从hdfs中拉取数据到打开web图形化界面的主机(一般是window)

注意:从hdfs中导出数据,只是导出真实数据,并没有导出元数据

2.3 Sqoop导出

Sqoop是一个工具,这个后期有专门的blog学习该工具怎么使用,这里不再赘述