引言
大数据时代,每天都会产生海量信息——你刷的短视频、点的外卖、逛的淘宝,背后都是数据在流动。如何从这些数据中快速提取有价值的信息?传统数据库在面对亿级数据时力不从心,这时候就需要一个更强大的工具。
Hive 应运而生。它是建立在 Hadoop 之上的数据仓库工具,巧妙之处在于:你只需要会写 SQL,Hive 就能帮你处理海量数据。它把熟悉的 SQL 语句翻译成分布式计算任务,在多台电脑上并行执行。
无论你未来想做数据分析师还是数据工程师,Hive 都是一道绕不开的风景。让我们一起走进 Hive 的世界吧!
把 Hive 想象成一个“数据翻译官”—— 它会把你写的 SQL 句子(类英语)翻译成 Hadoop 能听懂的 MapReduce 任务,然后在超多台电脑上一起计算!
一、关系型数据库 · 我们熟悉的“表格管家”
我们平时用的MySQL、Oracle、SQL Server就像一个个严格的“表格管理员”,数据存在一张张规整的表格里(行=记录,列=字段),而且表之间还能“拉关系”(主键、外键)。
行式存储:一行数据挨着存,适合频繁增删改查。
事务ACID:保证数据一致性,比如银行转账不能出错。
横向扩展难:数据太多时,加机器很麻烦,容易达到瓶颈。
瓶颈 当数据量巨大(比如网站每天上亿条日志),关系型数据库会“累趴下”:硬盘读写慢、多表关联查询卡顿、扩容困难…… 这时候就需要Hive来救场!
二、 Hive 是什么?
Hive是建立在 Hadoop 之上的数据仓库工具,它把 SQL 语句转换成 MapReduce 作业,在 Hadoop 集群上跑。简单说:
“用 SQL 的语法,干大数据的活”
容易上手
会写 SQL 就能用 Hive,不用学 Java 或 MapReduce。
数据存 HDFS
所有数据都放在 HDFS(分布式文件系统)上,可以存超大量文件。
元数据用 MySQL
Hive 用 MySQL 来存“表的结构信息”(元数据),支持多人同时访问。
可扩展
支持用户自定义函数(UDF),可以自己写处理逻辑。
优势:上百行的 MapReduce 代码,用一行 HQL 就能搞定!
缺点:不适合需要“秒级响应”的场景(比如实时搜索),它更适合批处理,比如分析一整天的日志。
三、 Hive 的数据模型 · 像搭积木一样
内部表 & 外部表
内部表:Hive 完全管理数据,删除表时数据也一起删掉。
外部表:Hive 只管理“链接”,数据存在你指定的 HDFS 路径,删除表时数据还在。
创建内部表示例 CREATE TABLE person_inside (id STRING, name STRING, sex STRING, age INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE;
创建外部表(指定位置) CREATE EXTERNAL TABLE person_ex (id STRING, name STRING, sex STRING, age INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/hivedb/';
数据存在这个 HDFS 目录
分区表 · 按文件夹分类
比如按城市 (city)分区,数据会存到不同的子文件夹,查询时只扫描需要的分区,速度更快!
CREATE TABLE person_part (id STRING, name STRING, sex STRING, age INT) PARTITIONED BY (city STRING) -- 按城市分区 ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; -- 加载数据到济南分区 LOAD DATA LOCAL INPATH '/tmp/person.txt' INTO TABLE person_part PARTITION(city='jinan');
分桶表 · 把数据打散到多个文件
分桶(Bucket)就像把数据根据某个字段(比如年龄)的哈希值,均匀放到N 个文件里,方便采样和 Join 优化。
CREATE TABLE person_bucket (id STRING, name STRING, sex STRING, age INT) PARTITIONED BY (city STRING) CLUSTERED BY (age) INTO 5 BUCKETS
分成 5 个桶 ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
开启分桶开关 SET hive.enforce.bucketing = true;
从其他表插入数据 INSERT INTO TABLE person_bucket PARTITION(city='jinan') SELECT * FROM person_inside;
小知识 分区是“文件夹”,分桶是“文件”。分区是粗粒度,分桶是细粒度,可以一起用!
四、部署与常用命令 · 像搭乐高一样
Hive 需要 MySQL 来存储元数据(因为默认的 Derby 数据库只能一个人用)。安装步骤大致是:
- 安装 MySQL,设置 root 密码。
- 下载 Hive 安装包,配置环境变量
HIVE_HOME。 - 修改
hive-site.xml,告诉 Hive 怎么连接 MySQL。 - 把 MySQL 驱动包放到
$HIVE_HOME/lib。 - 运行
schematool -dbType mysql -initSchema初始化。 - 输入
hive进入命令行,开始写 SQL!
常用 Hive 命令(类比 MySQL)
| 命令 | 作用 |
|---|---|
SHOW DATABASES; | 显示所有数据库 |
SHOW TABLES LIKE '*name*'; | 模糊搜索表名 |
DESC table_name; | 查看表结构 |
DESC FORMATTED table_name; | 查看详细表信息 |
SHOW PARTITIONS table_name; | 查看分区信息 |
DROP TABLE table_name; | 删除表(内部表数据也会删) |
导出数据:INSERT OVERWRITE LOCAL DIRECTORY '/tmp/export/' SELECT * FROM person_inside;
导出的文件默认以^A分隔(ASCII 001),也可以用其他分隔符。
五、查询与多表 JOIN · 像拼图一样
Hive 支持内连接、左外连接、全外连接、左半连接(类似于 IN 子查询)。注意:只支持等值连接(ON 里面用 =)。
内连接:两边都匹配的数据 SELECT * FROM employee JOIN job ON employee.employee_id = job.employee_id;
左外连接:左表全保留,右表没有则填 NULL SELECT * FROM employee LEFT OUTER JOIN job ON employee.employee_id = job.employee_id;
全外连接:左右全部保留 SELECT * FROM employee FULL OUTER JOIN job ON employee.employee_id = job.employee_id;
左半连接(相当于 IN) SELECT * FROM employee LEFT SEMI JOIN job ON employee.employee_id = job.employee_id;
LIKE / NOT LIKE 模糊查询:
SELECT * FROM employee WHERE name LIKE '张%';
以“张”开头 SELECT * FROM employee WHERE name NOT LIKE '张%';
六、HWI & HiveServer2 · 网页版和远程服务
HWI (Web 界面)
通过浏览器操作 Hive,查看表结构、执行查询,适合不想装客户端的同学。
HiveServer2
提供 JDBC/ODBC 服务,支持多客户端连接(比如 Beeline、Python),还有 Web UI 监控。
配置 HiveServer2 的 Web UI 只要在hive-site.xml设置hive.server2.webui.host和hive.server2.webui.port,然后浏览器访问http://主机:10002就能看到会话和查询情况。
七、总结
今天我们认识了这位“数据翻译官”——它把熟悉的 SQL 翻译成分布式计算任务,让你轻松处理海量数据。从内部表、外部表,到分区表和分桶表,Hive 用像搭积木一样的方式组织数据。
记住:Hive 适合离线批处理,不适合秒级响应。它虽然慢,但能搞定传统数据库扛不住的大数据!
下一步,你可以动手装一次 Hive,写几条 HQL 试试。学完 Hive,还可以继续挑战Spark SQL和HBase。