目录
-
摘要描述
-
Hive表管理
-
2.1 表的基本操作
-
2.2 内部表 vs 外部表
-
2.3 创建与加载外部表
-
-
Hive分区
-
3.1 静态分区
-
3.2 动态分区
-
-
总结
-
实战练习
-
常见面试题
-
附录:Hive配置参数
1. 摘要描述
本文详细讲解Hive中表管理与分区的核心操作,包括内部表与外部表的区别、静态分区与动态分区的实现方法。通过实战练习和面试题,帮助读者快速掌握Hive数据存储与优化的关键技能。
2. Hive表管理
2.1 表的基本操作
-
查看建表语句:
sql
SHOW CREATE TABLE emp;
-
描述表结构:
sql
DESC emp; DESC FORMATTED emp; -- 查看详细信息(包括存储路径、表类型等)
2.2 内部表 vs 外部表
特性 | 内部表(Managed Table) | 外部表(External Table) |
---|---|---|
创建方式 | 默认创建 | 需添加EXTERNAL 关键字 |
数据管理 | 数据由Hive管理 | 数据由HDFS管理 |
删除表的影响 | 删除元数据和HDFS数据 | 仅删除元数据,HDFS数据保留 |
TRUNCATE支持 | 支持 | 不支持 |
示例:创建外部表并加载数据
sql
-- 创建外部表
CREATE EXTERNAL TABLE emp_ext (
empno INT, ename STRING, job STRING,
mgr INT, hiredate STRING, sal INT, comm INT, deptno INT
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
-- 加载数据
LOAD DATA LOCAL INPATH '/home/emp' INTO TABLE emp_ext;
2.3 内部表与外部表的实战练习
-
创建外部表
dept_ext
:sql
CREATE EXTERNAL TABLE dept_ext (deptno INT, dname STRING, loc STRING);
-
加载数据:
sql
INSERT OVERWRITE TABLE dept_ext SELECT * FROM dept;
-
删除表观察HDFS变化:
-
删除内部表:HDFS数据一并删除。
-
删除外部表:仅元数据删除,HDFS数据保留。
-
3. Hive分区
3.1 静态分区
-
定义:手动指定分区值加载数据。
-
操作步骤:
-
创建分区表:
sql
CREATE TABLE t_sales ( brand STRING, price INT, quantity INT ) PARTITIONED BY (month INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
-
加载数据到指定分区:
sql
LOAD DATA LOCAL INPATH '/home/202001' INTO TABLE t_sales PARTITION (month=202001);
-
查询分区数据:
sql
SELECT * FROM t_sales WHERE month = 202001;
-
管理分区:
sql
-- 添加分区 ALTER TABLE t_sales ADD PARTITION (month=202003); -- 删除分区 ALTER TABLE t_sales DROP PARTITION (month=202001);
-
3.2 动态分区
-
定义:根据数据自动创建分区。
-
关键配置:
sql
SET hive.exec.dynamic.partition.mode = nonstrict; -- 启用非严格模式
-
示例:将
emp
表数据按deptno
动态分区sql
-- 创建分区表 CREATE TABLE emp_par ( empno INT, ename STRING, job STRING, mgr INT, hiredate STRING, sal INT, comm INT ) PARTITIONED BY (deptno INT); -- 插入数据(确保SELECT最后字段是分区字段) INSERT OVERWRITE TABLE emp_par SELECT empno, ename, job, mgr, hiredate, sal, comm, deptno FROM emp;
4. 总结
-
表管理:外部表适合共享数据,内部表适合临时数据。
-
静态分区:适用于明确分区值的场景。
-
动态分区:适用于分区字段值多样且需要自动分配的场景。
5. 实战练习
-
创建分区表
t_score
:sql
CREATE TABLE t_score ( sno INT, class STRING, score INT ) PARTITIONED BY (grade INT);
-
加载数据到分区:
sql
LOAD DATA LOCAL INPATH '/home/1' INTO TABLE t_score PARTITION (grade=1); LOAD DATA LOCAL INPATH '/home/2' INTO TABLE t_score PARTITION (grade=2);
6. 常见面试题
-
问题:Hive内部表与外部表的区别?
答:外部表数据由HDFS管理,删除表仅删除元数据;内部表数据由Hive管理,删除表会同时删除元数据和HDFS数据。 -
问题:动态分区为何需要设置
nonstrict
模式?
答:严格模式下要求至少一个静态分区,非严格模式允许所有分区动态生成。 -
问题:分区字段是否存在于数据文件中?
答:分区字段是“伪列”,数据文件中不存储,仅通过目录结构体现。
7. 附录:Hive配置参数
sql
-- 动态分区配置
SET hive.exec.dynamic.partition = true;
SET hive.exec.dynamic.partition.mode = nonstrict;
-- 其他优化参数
SET hive.optimize.sort.dynamic.partition = true;