大数据-14-Hive HQL 表连接查询 HDFS导入导出 逻辑运算 函数查询 全表查询

点一下关注吧!!!非常感谢!!持续更新!!!

🚀 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;
相关推荐
星环科技TDH社区版1 分钟前
星环科技产品可存储的表格式功能介绍以及创建示例
大数据·数据库
百度Geek说19 分钟前
百度垂搜数据管理系统弹性调度优化实践
大数据·搜索引擎
林太白27 分钟前
Rust-连接数据库
前端·后端·rust
bug菌41 分钟前
CAP定理真的是死结?业务系统到底该怎么取舍!
分布式·后端·架构
林太白1 小时前
Rust认识安装
前端·后端·rust
掘金酱1 小时前
🔥 稀土掘金 x Trae 夏日寻宝之旅火热进行ing:做任务赢大疆pocket3、Apple watch等丰富大礼
前端·后端·trae
xiayz1 小时前
引入mapstruct实现类的转换
后端
Java微观世界1 小时前
深入解析:Java中的原码、反码、补码——程序员的二进制必修课
后端
不想说话的麋鹿1 小时前
《NestJS 实战:RBAC 系统管理模块开发 (四)》:用户绑定
前端·后端·全栈
Java水解2 小时前
JavaScript 正则表达式
javascript·后端