面试提问:如何判断 Hive 表是内部表还是外部表?
此问题原本属于基础问题,但是偶尔被问到,求职者如果没有去准备,会很懵逼,在 Hive 中,可以通过以下方法判断表是内部表(Managed Table)还是外部表(External Table)
内部表(Managed Table):Hive 完全管理表的数据及元数据。当删除内部表时,Hive 会删除元数据和存储在 Hive 仓库中的数据文件。
外部表(External Table):Hive 仅管理表的元数据,数据文件由用户自行管理。当删除外部表时,Hive 只删除元数据,不会删除数据文件。
了解表的类型对于数据的生命周期管理非常重要,特别是在删除表时,可能会影响到数据的存储。
方法 1:使用 SHOW CREATE TABLE
命令
直接查看表的创建语句,若包含 EXTERNAL
关键字则为外部表,否则为内部表。
SHOW CREATE TABLE employee;
• 内部表示例输出:
CREATE TABLE `employee`(...)
• 外部表示例输出:
CREATE EXTERNAL TABLE `employee`(...)
方法 2:使用 DESCRIBE EXTENDED
或 DESCRIBE FORMATTED
通过查看表的元数据中的 Table Type
字段:
DESCRIBE FORMATTED your_table_name; -- 或 DESCRIBE EXTENDED your_table_name;
在输出结果中查找以下字段:• 内部表:Table Type: MANAGED_TABLE
• 外部表:Table Type: EXTERNAL_TABLE
输出示例:
# Detailed Table Information Database: example_db Owner: user_name CreateTime: Tue Oct 10 10:00:00 CST 2023 Table Type: MANAGED_TABLE ...
方法 3:直接查询 Hive 元数据库
如果熟悉 Hive 元数据库(如 MySQL),可以直接查询 TBLS
表和 TABLE_PARAMS
表:
SELECT t.TBL_NAME, p.PARAM_KEY, p.PARAM_VALUE FROM TBLS t LEFT JOIN TABLE_PARAMS p ON t.TBL_ID = p.TBL_ID WHERE t.TBL_NAME = 'your_table_name' AND p.PARAM_KEY = 'EXTERNAL';
• 如果 PARAM_VALUE
为 TRUE
,则是外部表。• 如果不存在该记录或值为 FALSE
,则是内部表。
查询结果示例:
+------------+------------+-------------+ | TBL_NAME | PARAM_KEY | PARAM_VALUE | +------------+------------+-------------+ | sales | EXTERNAL | TRUE | <-- 外部表 +------------+------------+-------------+
或内部表结果:
+------------+------------+-------------+ | TBL_NAME | PARAM_KEY | PARAM_VALUE | +------------+------------+-------------+ | employee | EXTERNAL | FALSE | <-- 内部表 +------------+------------+-------------+
注意:如果查询结果为 NULL
或无记录,默认视为内部表。
方法 4:查看表的属性 (TBLPROPERTIES
)
某些情况下,表的属性中会明确标记是否为外部表:
DESCRIBE EXTENDED ages;
1.查看 Table Parameters:
-
查找输出中的
table parameters
部分。 -
如果存在
'EXTERNAL'='TRUE'
,则为外部表。 -
如果不存在该参数或为
'EXTERNAL'='FALSE'
,则为内部表。
#,col_name,data_type
4,Detailed Table Information,"Table(tableName:ages, dbName:16_test, owner:root, createTime:1735192899, lastAccessTime:0, retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:tens, type:int, comment:null), FieldSchema(name:ones, type:int, comment:null)], location:hdfs://hcss-ecs-537b:9000/user/hive/warehouse/16_test.db/ages, inputFormat:org.apache.hadoop.mapred.TextInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat, compressed:false, numBuckets:-1, serdeInfo:SerDeInfo(name:null, serializationLib:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, parameters:{serialization.format=1}), bucketCols:[], sortCols:[], parameters:{}, skewedInfo:SkewedInfo(skewedColNames:[], skewedColValues:[], skewedColValueLocationMaps:{}), storedAsSubDirectories:false), partitionKeys:[], parameters:{transient_lastDdlTime=1735192899, bucketing_version=2}, viewOriginalText:null, viewExpandedText:null, tableType:MANAGED_TABLE, rewriteEnabled:false, catName:hive, ownerType:USER)"
2.查看 Location 信息:
内部表:数据通常存储在 Hive 的默认仓库目录,例如:
hdfs://namenode:8020/user/hive/warehouse/test.db/test_table
外部表:数据存储在用户指定的 HDFS 路径,可能不在默认仓库目录下,例如:
hdfs://namenode:8020/data/external/test_table
关键区别总结
特征 | 内部表 (Managed Table) | 外部表 (External Table) |
---|---|---|
数据生命周期 | 删除表时,数据会被删除 | 删除表时,数据保留在 HDFS |
创建语法 | CREATE TABLE ... | CREATE EXTERNAL TABLE ... |
元数据标记 | Table Type: MANAGED_TABLE | Table Type: EXTERNAL_TABLE |
注意事项
-
如果表是通过早期 Hive 版本创建的,可能需要手动检查元数据。
-
确保对表有足够的权限执行元数据查询操作。
通过这些方法,可以快速确定 Hive 表的类型,避免误删数据或混淆存储位置。
会飞的一十六
一个专注大于大数据、数据库、数据分析、相关领域的公众号,分享技术干货、学习资料、面试、职场经验和个人思考感悟,更重要的是让SQLBOY的SQL有质的飞越。
面试提问:数仓设计不分层可以吗?
从O(n²)到O(n):基于累计求和模型的线性递归模式优化与多场景实战
基于增量滚动计算策略的数仓累计计算指标的优化实战
Hive正则表达式基础用法与应用
千亿级表中收入中位数如何利用Hive SQL优化?
宽表指标合并踩坑:UNION ALL和LEFT JOIN到底怎么选?
如果您觉得本文还不错,对你有帮助,那么不妨可以关注一下我的数字化建设实践之路专栏,这里的内容会更精彩。
专栏 原价99,现在活动价59.9,按照阶梯式增长,还差5个人上升到69.9,最终恢复到原价。
专栏优势:
(1)一次收费持续更新。
(2)实战中总结的SQL技巧,帮助SQLBOY 在SQL语言上有质的飞越,无论你应对业务难题及面试都会游刃有余【全网唯一讲SQL实战技巧,方法独特】
SQL很简单,可你却写不好?每天一点点,收获不止一点点-CSDN博客
(3)实战中数仓建模技巧总结,让你认识不一样的数仓。【数据建模+业务建模,不一样的认知体系】(如果只懂数据建模而不懂业务建模,数仓体系认知是不全面的)
(4)数字化建设当中遇到难题解决思路及问题思考。
我的专栏具体链接如下:
数字化建设通关指南_莫叫石榴姐的博客-CSDN博客