写点什么

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

作者:武子康
  • 2025-06-17
    美国
  • 本文字数:2855 字

    阅读完需:约 9 分钟

大数据-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 ResponseMyBatis 已完结,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)

LOAD DATA LOCAL INPATH '/path/to/local/file.txt' INTO TABLE my_table;
复制代码


  • LOCAL:表示文件在客户端本地;不写 LOCAL 则表示是 HDFS 上的路径。

  • INTO:表示保留原有数据;使用 OVERWRITE 则会清空表中原数据。

  • 要求目标表必须已存在。

  • 文件格式必须与表定义一致(例如分隔符)。


LOAD DATA LOCAL INPATH '/home/hadoop/data.csv' OVERWRITE INTO TABLE emp;
复制代码

从 HDFS 导入数据(LOAD DATA)

LOAD DATA INPATH '/user/hadoop/file.txt' INTO TABLE my_table;
复制代码


  • 文件需预先放置于 HDFS 中(使用 hdfs dfs -put)。

  • 适用于大文件。

使用 INSERT 导入查询结果

将查询结果插入到目标表:


INSERT INTO TABLE my_tableSELECT * FROM another_table WHERE age > 30;
复制代码


或覆盖已有数据:


INSERT OVERWRITE TABLE my_tableSELECT * FROM another_table WHERE age > 30;
复制代码


  • 可用于不同表、不同字段映射的结构化导入。

  • 也可以和 PARTITION、DYNAMIC PARTITION 配合使用。

使用外部表读取已有 HDFS 数据

CREATE EXTERNAL TABLE my_table (  id INT,  name STRING)ROW FORMAT DELIMITED FIELDS TERMINATED BY ','LOCATION '/user/hadoop/data/';
复制代码


  • Hive 不会管理该目录数据的生命周期。

  • 删除表不会删除 HDFS 上的数据。

使用 Sqoop 导入关系型数据库数据(常见于 MySQL → Hive)

sqoop import \--connect jdbc:mysql://localhost/db \--username root --password root \--table emp \--hive-import \--hive-table emp_hive
复制代码

数据导出

查询导出到本地(INSERT OVERWRITE DIRECTORY)

INSERT OVERWRITE LOCAL DIRECTORY '/home/hadoop/output'ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'SELECT * FROM emp;
复制代码


  • LOCAL 表示导出到本地文件系统;不写则导出到 HDFS。

  • 结果存储为纯文本文件,适合进一步处理或使用。

查询导出到 HDFS

INSERT OVERWRITE DIRECTORY '/user/hadoop/output'ROW FORMAT DELIMITED FIELDS TERMINATED BY ','SELECT id, name FROM emp;
复制代码

使用 Hive EXPORT 导出整个表数据和元数据

EXPORT TABLE emp TO '/user/hive/backup/emp_export';
复制代码


  • 会在指定路径下创建表结构和数据的拷贝(备份用途)。

  • 配合 IMPORT 可将整个表恢复或迁移到另一 Hive 实例。

Sqoop 导出到关系型数据库(如 Hive → MySQL)

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

实机测试

默认格式

将查询结果导出到本地


insert overwrite local directory '/opt/wzk/hive_test/tabC'select * from tabC;
复制代码



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



使用 vim 工具查看具体内容:


5^Awangwu^ABJ^A2024074^Alishi^ASH^A2024073^Azhangsan^ATJ^A202407
复制代码

自定格式

我们发现,默认格式导出的有一些符号,我们可以指定符号:


insert overwrite local directory '/opt/wzk/hive_test/tabC2'row format delimited fields terminated by ' 'select * from tabC;
复制代码



同样,我们使用 vim 工具打开查看情况:


5 wangwu BJ 2024074 lishi SH 2024073 zhangsan TJ 202407
复制代码

导出至 HDFS

insert overwrite directory '/wzk/hive_test/tabC3'row format delimited fields terminated by ' 'select * from tabC;
复制代码


执行结果如下:



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


HQL

新建文件

新建一个文本文件,写入如下的内容,用作后续的测试


7369,SMITH,CLERK,7902,2010-12-17,800,,207499,ALLEN,SALESMAN,7698,2011-02-20,1600,300,307521,WARD,SALESMAN,7698,2011-02-22,1250,500,307566,JONES,MANAGER,7839,2011-04-02,2975,,207654,MARTIN,SALESMAN,7698,2011-09-28,1250,1400,307698,BLAKE,MANAGER,7839,2011-05-01,2850,,307782,CLARK,MANAGER,7839,2011-06-09,2450,,107788,SCOTT,ANALYST,7566,2017-07-13,3000,,207839,KING,PRESIDENT,,2011-11-07,5000,,107844,TURNER,SALESMAN,7698,2011-09-08,1500,0,307876,ADAMS,CLERK,7788,2017-07-13,1100,,207900,JAMES,CLERK,7698,2011-12-03,950,,307902,FORD,ANALYST,7566,2011-12-03,3000,,207934,MILLER,CLERK,7782,2012-01-23,1300,,10
复制代码

上传文件

将文件上传至 HDFS


hdfs dfs -put test02.txt /wzk/hive_test/test02.txt
复制代码

创建新表

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 中


LOAD DATA LOCAL INPATH '/opt/wzk/hive_test/test02.txt'INTO TABLE emp;
复制代码


全表查询

SELECT * FROM emp;
复制代码


可以看到数据已经按照我们的想法导入了:


部分字段查询

这与我们平常写 SQL 基本是一样的:


select ename, sal, comm from emp;
复制代码


函数查询

select sum(sal) from emp;select max(sal) from emp;select min(sal) from emp;select avg(sal) from emp;
复制代码


限制条数

select * from emp limit 3;
复制代码


WHERE

select * from empwhere sal > 2000;
复制代码


逻辑运算

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

select deptno, avg(sal)from empgroup by deptno;
复制代码


ORDER BY

select * from emp order by deptno;
复制代码



发布于: 刚刚阅读数: 3
用户头像

武子康

关注

永远好奇 无限进步 2019-04-14 加入

Hi, I'm Zikang,好奇心驱动的探索者 | INTJ / INFJ 我热爱探索一切值得深究的事物。对技术、成长、效率、认知、人生有着持续的好奇心和行动力。 坚信「飞轮效应」,相信每一次微小的积累,终将带来深远的改变。

评论

发布
暂无评论
大数据-14-Hive HQL 表连接查询 HDFS导入导出 逻辑运算 函数查询 全表查询_大数据_武子康_InfoQ写作社区