点一下关注吧!!!非常感谢!!持续更新!!!
🚀 AI篇持续更新中!(长期更新)
目前2025年06月16日更新到: AI炼丹日志-29 - 字节跳动 DeerFlow 深度研究框架 私有部署 测试上手 架构研究,持续打造实用AI工具指南!📐🤖
💻 Java篇正式开启!(300篇)
目前2025年06月17日更新到: Java-48 深入浅出 Tomcat 手写 Tomcat 实现【01】 MiniCat Bootstrap HttpServlet Request Response MyBatis 已完结,Spring 已完结,Nginx已完结,Tomcat正在更新,深入浅出助你打牢基础!
📊 大数据板块已完成多项干货更新(300篇):
包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈! 目前2025年06月13日更新到: 大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT案例 详解

章节内容
上一节我们完成了:
- 启动Hive
- 测试Hive
- 修改配置
- 简单测试
背景介绍
这里是三台公网云服务器,每台 2C4G,搭建一个Hadoop的学习环境,供我学习。 之前已经在 VM 虚拟机上搭建过一次,但是没留下笔记,这次趁着前几天薅羊毛的3台机器
- 2C4G 编号 h121
- 2C4G 编号 h122
- 2C2G 编号 h123

数据导入
在 Hive 中,HQL(Hive Query Language)支持多种数据的导入与导出方式,用于将数据写入 Hive 表或从表中导出至本地/HDFS/其他系统。这些操作本质上依赖于 HDFS、MapReduce、Hive 的存储和查询机制。
从本地文件导入数据(LOAD DATA LOCAL)
sql
LOAD DATA LOCAL INPATH '/path/to/local/file.txt' INTO TABLE my_table;
- LOCAL:表示文件在客户端本地;不写 LOCAL 则表示是 HDFS 上的路径。
- INTO:表示保留原有数据;使用 OVERWRITE 则会清空表中原数据。
- 要求目标表必须已存在。
- 文件格式必须与表定义一致(例如分隔符)。
sql
LOAD DATA LOCAL INPATH '/home/hadoop/data.csv' OVERWRITE INTO TABLE emp;
从 HDFS 导入数据(LOAD DATA)
sql
LOAD DATA INPATH '/user/hadoop/file.txt' INTO TABLE my_table;
- 文件需预先放置于 HDFS 中(使用 hdfs dfs -put)。
- 适用于大文件。
使用 INSERT 导入查询结果
将查询结果插入到目标表:
sql
INSERT INTO TABLE my_table
SELECT * FROM another_table WHERE age > 30;
或覆盖已有数据:
sql
INSERT OVERWRITE TABLE my_table
SELECT * FROM another_table WHERE age > 30;
- 可用于不同表、不同字段映射的结构化导入。
- 也可以和 PARTITION、DYNAMIC PARTITION 配合使用。
使用外部表读取已有 HDFS 数据
sql
CREATE EXTERNAL TABLE my_table (
id INT,
name STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/user/hadoop/data/';
- Hive 不会管理该目录数据的生命周期。
- 删除表不会删除 HDFS 上的数据。
使用 Sqoop 导入关系型数据库数据(常见于 MySQL → Hive)
shell
sqoop import \
--connect jdbc:mysql://localhost/db \
--username root --password root \
--table emp \
--hive-import \
--hive-table emp_hive
数据导出
查询导出到本地(INSERT OVERWRITE DIRECTORY)
sql
INSERT OVERWRITE LOCAL DIRECTORY '/home/hadoop/output'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
SELECT * FROM emp;
- LOCAL 表示导出到本地文件系统;不写则导出到 HDFS。
- 结果存储为纯文本文件,适合进一步处理或使用。
查询导出到 HDFS
sql
INSERT OVERWRITE DIRECTORY '/user/hadoop/output'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
SELECT id, name FROM emp;
使用 Hive EXPORT 导出整个表数据和元数据
sql
EXPORT TABLE emp TO '/user/hive/backup/emp_export';
- 会在指定路径下创建表结构和数据的拷贝(备份用途)。
- 配合 IMPORT 可将整个表恢复或迁移到另一 Hive 实例。
Sqoop 导出到关系型数据库(如 Hive → MySQL)
shell
sqoop export \
--connect jdbc:mysql://localhost/db \
--username root --password root \
--table emp \
--export-dir /user/hive/warehouse/emp \
--input-fields-terminated-by '\001'
使用建议
- 本地 CSV 小文件 → Hive:LOAD DATA LOCAL INPATH
- 大文件导入:HDFS + LOAD DATA INPATH
- 结构化转换/插入:INSERT INTO/OVERWRITE TABLE
- 查询结果导出为文件:INSERT OVERWRITE DIRECTORY
- Hive → Hive 迁移:EXPORT + IMPORT
- Hive ↔ MySQL:使用 Sqoop
实机测试
默认格式
将查询结果导出到本地
shell
insert overwrite local directory '/opt/wzk/hive_test/tabC'
select * from tabC;


我们查看目录,已经导出了:

使用 vim 工具查看具体内容:
shell
5^Awangwu^ABJ^A202407
4^Alishi^ASH^A202407
3^Azhangsan^ATJ^A202407
自定格式
我们发现,默认格式导出的有一些符号,我们可以指定符号:
shell
insert overwrite local directory '/opt/wzk/hive_test/tabC2'
row format delimited fields terminated by ' '
select * from tabC;

同样,我们使用 vim 工具打开查看情况:
shell
5 wangwu BJ 202407
4 lishi SH 202407
3 zhangsan TJ 202407
导出至HDFS
shell
insert overwrite directory '/wzk/hive_test/tabC3'
row format delimited fields terminated by ' '
select * from tabC;
执行结果如下:

我们查看 HDFS 内容,可以看到:

HQL
新建文件
新建一个文本文件,写入如下的内容,用作后续的测试
shell
7369,SMITH,CLERK,7902,2010-12-17,800,,20
7499,ALLEN,SALESMAN,7698,2011-02-20,1600,300,30
7521,WARD,SALESMAN,7698,2011-02-22,1250,500,30
7566,JONES,MANAGER,7839,2011-04-02,2975,,20
7654,MARTIN,SALESMAN,7698,2011-09-28,1250,1400,30
7698,BLAKE,MANAGER,7839,2011-05-01,2850,,30
7782,CLARK,MANAGER,7839,2011-06-09,2450,,10
7788,SCOTT,ANALYST,7566,2017-07-13,3000,,20
7839,KING,PRESIDENT,,2011-11-07,5000,,10
7844,TURNER,SALESMAN,7698,2011-09-08,1500,0,30
7876,ADAMS,CLERK,7788,2017-07-13,1100,,20
7900,JAMES,CLERK,7698,2011-12-03,950,,30
7902,FORD,ANALYST,7566,2011-12-03,3000,,20
7934,MILLER,CLERK,7782,2012-01-23,1300,,10
上传文件
将文件上传至 HDFS
shell
hdfs dfs -put test02.txt /wzk/hive_test/test02.txt
创建新表
shell
CREATE TABLE emp (
empno int,
ename string,
job string,
mgr int,
hiredate DATE,
sal int,
comm int,
deptno int
)row format delimited fields terminated by ",";
我们将数据加载到Hive中
shell
LOAD DATA LOCAL INPATH '/opt/wzk/hive_test/test02.txt'
INTO TABLE emp;
全表查询
shell
SELECT * FROM emp;
可以看到数据已经按照我们的想法导入了:

部分字段查询
这与我们平常写SQL基本是一样的:
shell
select ename, sal, comm from emp;

函数查询
shell
select sum(sal) from emp;
select max(sal) from emp;
select min(sal) from emp;
select avg(sal) from emp;

限制条数
shell
select * from emp limit 3;

WHERE
shell
select * from emp
where sal > 2000;

逻辑运算
shell
select null=null;
select null==null;
select null<=>null;
select * from emp where comm is null;
select * from emp where deptno in (20, 30);
GROUP BY
shell
select deptno, avg(sal)
from emp
group by deptno;

ORDER BY
shell
select * from emp order by deptno;