一、内部表Managed Table什么是内部表内部表是 Hive 的默认表类型它的元数据存储在 MySQL 中和数据文件存储在 HDFS 上完全由 Hive 自身管理。创建内部表CREATE TABLE student (id INT,name STRING,age INT)ROW FORMAT DELIMITED FIELDS TERMINATED BY ,;核心特性• 内部表完全由 Hive 管理元数据 数据文件• 使用 LOAD DATA 加载数据时数据文件会被移动到 Hive 仓库目录• 删除内部表时元数据和数据文件都会被删除二、外部表External Table什么是外部表外部表允许 Hive 访问存储在 HDFS 上但不属于 Hive 仓库目录的数据。外部表的元数据由 Hive 管理而数据文件则由 HDFS 管理。创建外部表CREATE EXTERNAL TABLE external_student (id INT,name STRING,age INT)ROW FORMAT DELIMITED FIELDS TERMINATED BY ,LOCATION /user/data/student;核心特性• 元数据由 Hive 管理数据文件由 HDFS 管理• 删除外部表时只删除元数据数据文件仍然保留• 数据更加安全不会因误删表而导致数据丢失三、内部表 vs 外部表面试高频题 对比维度内部表Managed Table外部表External Table管理范围元数据 数据文件完全由 Hive 管理元数据由 Hive 管理数据由 HDFS 管理创建语法CREATE TABLE默认CREATE EXTERNAL TABLE删除行为删除元数据 数据文件只删除元数据数据文件保留数据安全性相对较低相对较高误删可恢复数据适用场景临时表、测试数据、ETL 中间表数据来自外部、共享数据、原始数据保护 拓展思考内部表和外部表的相互转换-- 内部表 → 外部表ALTER TABLE table_name SET TBLPROPERTIES(EXTERNALTRUE);-- 外部表 → 内部表ALTER TABLE table_name SET TBLPROPERTIES(EXTERNALFALSE);────────────────────────────────────────四、分区表Partitioned Table什么是分区表Hive 分区表是一种优化 Hive 查询的方法用以提高查询性能。分区表通过将数据分散到不同的分区目录中使得查询仅扫描目标分区的数据而不是整个表从而大大减少了数据扫描的范围。创建分区表CREATE TABLE trade (city STRING,amt INT)PARTITIONED BY (sf STRING)ROW FORMAT DELIMITED FIELDS TERMINATED BY ,;添加分区的两种方式方式一手动添加分区ALTER TABLEALTER TABLE trade ADD PARTITION(sfshandong);ALTER TABLE trade ADD PARTITION(sfhenan);方式二MSCK REPAIR推荐常用方式先将外部数据文件上传put到 Hive 表的对应分区目录中此时数据还没有元数据信息然后执行修复命令自动添加元数据MSCK REPAIR TABLE trade;查询分区数据SELECT * FROM trade WHERE sfshandong;五、动态分区表什么是动态分区动态分区允许在插入数据时根据分区字段的值自动创建对应的分区无需手动创建每个分区。在数据量较大或分区数量不确定时非常有用。实现步骤第①步创建临时表存储全部数据CREATE TABLE city (province_id STRING,city_id STRING,amount INT,city_name STRING)ROW FORMAT DELIMITED FIELDS TERMINATED BY ,;第②步上传数据到临时表第③步开启 Hive 支持动态分区的参数SET hive.exec.dynamic.partitiontrue;SET hive.exec.dynamic.partition.modenonstrict;第④步创建分区表CREATE TABLE city_dtfq (province_id STRING,city_id STRING,amount INT,city_name STRING)PARTITIONED BY (sf STRING);第⑤步从临时表导入数据到分区表自动创建分区⚠️ 分区字段必须放在 SELECT 语句的最后INSERT INTO city_dtfq PARTITION(sf)SELECT province_id, city_id, amount, city_name,province_id -- 该字段的值作为 sf 分区的值自动创建分区FROM city;六、分桶表Bucketed Table什么是分桶表在 Hive 中对表进行分桶Bucketing是一种优化数据查询和数据存储的方法。分桶可以帮助提高某些类型查询的效率特别是在执行 JOIN 操作时。分桶通过将数据按照指定列的哈希值分散到多个文件中每个文件称为一个桶Bucket从而使得查询可以更快地定位到需要的数据。实现步骤第①步创建临时表存储全部数据CREATE TABLE city (province_id STRING,city_id STRING,amount INT,city_name STRING)ROW FORMAT DELIMITED FIELDS TERMINATED BY ,;第②步上传数据到临时表第③步创建分桶表指定分桶字段和桶数量CREATE TABLE city_ft (province_id STRING,city_id STRING,amount INT,city_name STRING)CLUSTERED BY (province_id) INTO 2 BUCKETS;第④步设置支持分桶的参数SET hive.enforce.bucketingtrue;第⑤步从临时表导入数据到分桶表INSERT INTO city_ft SELECT * FROM city;──────────────────────────────────────── 面试重点提示1️⃣ 内部表 vs 外部表的区别是 Hive 面试中的必问题一定要熟记2️⃣ 分区表是最常用的查询优化手段要重点掌握动态分区的使用3️⃣ 分桶表常用于 JOIN 优化和抽样查询了解原理即可4️⃣ 实际工作中外部表 分区表配合使用是最常见的组合
Hive 的四表类型
一、内部表Managed Table什么是内部表内部表是 Hive 的默认表类型它的元数据存储在 MySQL 中和数据文件存储在 HDFS 上完全由 Hive 自身管理。创建内部表CREATE TABLE student (id INT,name STRING,age INT)ROW FORMAT DELIMITED FIELDS TERMINATED BY ,;核心特性• 内部表完全由 Hive 管理元数据 数据文件• 使用 LOAD DATA 加载数据时数据文件会被移动到 Hive 仓库目录• 删除内部表时元数据和数据文件都会被删除二、外部表External Table什么是外部表外部表允许 Hive 访问存储在 HDFS 上但不属于 Hive 仓库目录的数据。外部表的元数据由 Hive 管理而数据文件则由 HDFS 管理。创建外部表CREATE EXTERNAL TABLE external_student (id INT,name STRING,age INT)ROW FORMAT DELIMITED FIELDS TERMINATED BY ,LOCATION /user/data/student;核心特性• 元数据由 Hive 管理数据文件由 HDFS 管理• 删除外部表时只删除元数据数据文件仍然保留• 数据更加安全不会因误删表而导致数据丢失三、内部表 vs 外部表面试高频题 对比维度内部表Managed Table外部表External Table管理范围元数据 数据文件完全由 Hive 管理元数据由 Hive 管理数据由 HDFS 管理创建语法CREATE TABLE默认CREATE EXTERNAL TABLE删除行为删除元数据 数据文件只删除元数据数据文件保留数据安全性相对较低相对较高误删可恢复数据适用场景临时表、测试数据、ETL 中间表数据来自外部、共享数据、原始数据保护 拓展思考内部表和外部表的相互转换-- 内部表 → 外部表ALTER TABLE table_name SET TBLPROPERTIES(EXTERNALTRUE);-- 外部表 → 内部表ALTER TABLE table_name SET TBLPROPERTIES(EXTERNALFALSE);────────────────────────────────────────四、分区表Partitioned Table什么是分区表Hive 分区表是一种优化 Hive 查询的方法用以提高查询性能。分区表通过将数据分散到不同的分区目录中使得查询仅扫描目标分区的数据而不是整个表从而大大减少了数据扫描的范围。创建分区表CREATE TABLE trade (city STRING,amt INT)PARTITIONED BY (sf STRING)ROW FORMAT DELIMITED FIELDS TERMINATED BY ,;添加分区的两种方式方式一手动添加分区ALTER TABLEALTER TABLE trade ADD PARTITION(sfshandong);ALTER TABLE trade ADD PARTITION(sfhenan);方式二MSCK REPAIR推荐常用方式先将外部数据文件上传put到 Hive 表的对应分区目录中此时数据还没有元数据信息然后执行修复命令自动添加元数据MSCK REPAIR TABLE trade;查询分区数据SELECT * FROM trade WHERE sfshandong;五、动态分区表什么是动态分区动态分区允许在插入数据时根据分区字段的值自动创建对应的分区无需手动创建每个分区。在数据量较大或分区数量不确定时非常有用。实现步骤第①步创建临时表存储全部数据CREATE TABLE city (province_id STRING,city_id STRING,amount INT,city_name STRING)ROW FORMAT DELIMITED FIELDS TERMINATED BY ,;第②步上传数据到临时表第③步开启 Hive 支持动态分区的参数SET hive.exec.dynamic.partitiontrue;SET hive.exec.dynamic.partition.modenonstrict;第④步创建分区表CREATE TABLE city_dtfq (province_id STRING,city_id STRING,amount INT,city_name STRING)PARTITIONED BY (sf STRING);第⑤步从临时表导入数据到分区表自动创建分区⚠️ 分区字段必须放在 SELECT 语句的最后INSERT INTO city_dtfq PARTITION(sf)SELECT province_id, city_id, amount, city_name,province_id -- 该字段的值作为 sf 分区的值自动创建分区FROM city;六、分桶表Bucketed Table什么是分桶表在 Hive 中对表进行分桶Bucketing是一种优化数据查询和数据存储的方法。分桶可以帮助提高某些类型查询的效率特别是在执行 JOIN 操作时。分桶通过将数据按照指定列的哈希值分散到多个文件中每个文件称为一个桶Bucket从而使得查询可以更快地定位到需要的数据。实现步骤第①步创建临时表存储全部数据CREATE TABLE city (province_id STRING,city_id STRING,amount INT,city_name STRING)ROW FORMAT DELIMITED FIELDS TERMINATED BY ,;第②步上传数据到临时表第③步创建分桶表指定分桶字段和桶数量CREATE TABLE city_ft (province_id STRING,city_id STRING,amount INT,city_name STRING)CLUSTERED BY (province_id) INTO 2 BUCKETS;第④步设置支持分桶的参数SET hive.enforce.bucketingtrue;第⑤步从临时表导入数据到分桶表INSERT INTO city_ft SELECT * FROM city;──────────────────────────────────────── 面试重点提示1️⃣ 内部表 vs 外部表的区别是 Hive 面试中的必问题一定要熟记2️⃣ 分区表是最常用的查询优化手段要重点掌握动态分区的使用3️⃣ 分桶表常用于 JOIN 优化和抽样查询了解原理即可4️⃣ 实际工作中外部表 分区表配合使用是最常见的组合