Hive内部表与外部表深度解析:选择背后的设计哲学
-
- 一、直观对比:核心区别一张图
-
- 1.1 一句话核心区别
- 二、创建表时的行为差异
-
- 2.1 内部表创建过程
- 2.2 外部表创建过程
- 三、删除表时的行为差异
-
- 3.1 内部表删除
- 3.2 外部表删除
- 四、本质区别:谁拥有数据?
-
- 4.1 生命周期管理对比
- 4.2 数据所有权对比
- 五、使用场景深度分析
-
- 5.1 外部表适用场景
- 5.2 内部表适用场景
- 5.3 场景选择决策树
- 六、混合使用的最佳实践
-
- 6.1 分层设计中的表类型选择
- 6.2 生产环境配置示例
- 七、面试高频问题
-
- Q1:什么时候用内部表,什么时候用外部表?
- Q2:外部表的数据被误删了怎么办?
- Q3:如何将内部表转为外部表?反之呢?
- Q4:LOAD DATA到外部表会发生什么?
- Q5:分区表和外部表可以一起用吗?
- 八、总结
-
- 8.1 核心区别速记表
- 8.2 生产实践黄金法则
|
🌺The Begin🌺点点关注,收藏不迷路🌺 |
关键词:Hive、内部表、外部表、元数据管理、数据安全、数据共享、生产实践
在Hive数据仓库中,**内部表(Internal Table)和外部表(External Table)**的选择,是每个Hive使用者必须面对的第一个重要决策。这个看似简单的选择,实际上深刻影响着数据的安全性、共享性以及生命周期管理。
今天,我们将深入剖析这两种表的本质区别、适用场景以及背后的设计思想,帮助你在实际工作中做出正确的选择。
一、直观对比:核心区别一张图
#mermaid-svg-8O2ZXJPt8OlYaDwe{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-8O2ZXJPt8OlYaDwe .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-8O2ZXJPt8OlYaDwe .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-8O2ZXJPt8OlYaDwe .error-icon{fill:#552222;}#mermaid-svg-8O2ZXJPt8OlYaDwe .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-8O2ZXJPt8OlYaDwe .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-8O2ZXJPt8OlYaDwe .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-8O2ZXJPt8OlYaDwe .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-8O2ZXJPt8OlYaDwe .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-8O2ZXJPt8OlYaDwe .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-8O2ZXJPt8OlYaDwe .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-8O2ZXJPt8OlYaDwe .marker{fill:#333333;stroke:#333333;}#mermaid-svg-8O2ZXJPt8OlYaDwe .marker.cross{stroke:#333333;}#mermaid-svg-8O2ZXJPt8OlYaDwe svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-8O2ZXJPt8OlYaDwe p{margin:0;}#mermaid-svg-8O2ZXJPt8OlYaDwe .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-8O2ZXJPt8OlYaDwe .cluster-label text{fill:#333;}#mermaid-svg-8O2ZXJPt8OlYaDwe .cluster-label span{color:#333;}#mermaid-svg-8O2ZXJPt8OlYaDwe .cluster-label span p{background-color:transparent;}#mermaid-svg-8O2ZXJPt8OlYaDwe .label text,#mermaid-svg-8O2ZXJPt8OlYaDwe span{fill:#333;color:#333;}#mermaid-svg-8O2ZXJPt8OlYaDwe .node rect,#mermaid-svg-8O2ZXJPt8OlYaDwe .node circle,#mermaid-svg-8O2ZXJPt8OlYaDwe .node ellipse,#mermaid-svg-8O2ZXJPt8OlYaDwe .node polygon,#mermaid-svg-8O2ZXJPt8OlYaDwe .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-8O2ZXJPt8OlYaDwe .rough-node .label text,#mermaid-svg-8O2ZXJPt8OlYaDwe .node .label text,#mermaid-svg-8O2ZXJPt8OlYaDwe .image-shape .label,#mermaid-svg-8O2ZXJPt8OlYaDwe .icon-shape .label{text-anchor:middle;}#mermaid-svg-8O2ZXJPt8OlYaDwe .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-8O2ZXJPt8OlYaDwe .rough-node .label,#mermaid-svg-8O2ZXJPt8OlYaDwe .node .label,#mermaid-svg-8O2ZXJPt8OlYaDwe .image-shape .label,#mermaid-svg-8O2ZXJPt8OlYaDwe .icon-shape .label{text-align:center;}#mermaid-svg-8O2ZXJPt8OlYaDwe .node.clickable{cursor:pointer;}#mermaid-svg-8O2ZXJPt8OlYaDwe .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-8O2ZXJPt8OlYaDwe .arrowheadPath{fill:#333333;}#mermaid-svg-8O2ZXJPt8OlYaDwe .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-8O2ZXJPt8OlYaDwe .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-8O2ZXJPt8OlYaDwe .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8O2ZXJPt8OlYaDwe .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-8O2ZXJPt8OlYaDwe .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8O2ZXJPt8OlYaDwe .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-8O2ZXJPt8OlYaDwe .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-8O2ZXJPt8OlYaDwe .cluster text{fill:#333;}#mermaid-svg-8O2ZXJPt8OlYaDwe .cluster span{color:#333;}#mermaid-svg-8O2ZXJPt8OlYaDwe div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-8O2ZXJPt8OlYaDwe .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-8O2ZXJPt8OlYaDwe rect.text{fill:none;stroke-width:0;}#mermaid-svg-8O2ZXJPt8OlYaDwe .icon-shape,#mermaid-svg-8O2ZXJPt8OlYaDwe .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8O2ZXJPt8OlYaDwe .icon-shape p,#mermaid-svg-8O2ZXJPt8OlYaDwe .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-8O2ZXJPt8OlYaDwe .icon-shape rect,#mermaid-svg-8O2ZXJPt8OlYaDwe .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8O2ZXJPt8OlYaDwe .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-8O2ZXJPt8OlYaDwe .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-8O2ZXJPt8OlYaDwe :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
删除表示意图
外部表删除
DROP TABLE
外部表
元数据删除数据文件保留
内部表删除
DROP TABLE
内部表
元数据删除数据文件删除
创建表示意图
外部表创建
仅记录路径不移动数据
数据文件/data/raw/logs.txt
元数据记录LOCATION='/data/raw'
内部表创建
LOAD DATA移动数据
数据文件/user/hive/data.txt
仓库目录/user/hive/warehouse/db/table
1.1 一句话核心区别
| 创建时 | 数据移动到仓库目录 | 只记录路径,数据不动 |
| 删除时 | 元数据+数据一起删 | 只删元数据,数据保留 |
| 生命周期 | Hive完全管理 | Hive部分管理 |
| 数据归属 | Hive拥有数据 | 数据独立于Hive |
二、创建表时的行为差异
2.1 内部表创建过程
— 创建内部表
CREATE TABLE inner_table (
id INT,
name STRING,
age INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',';
— 加载数据(内部表专用)
LOAD DATA LOCAL INPATH '/home/hadoop/data.txt'
INTO TABLE inner_table;
内部表加载数据的背后:
#mermaid-svg-Y96016E8bXNLkrNR{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Y96016E8bXNLkrNR .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Y96016E8bXNLkrNR .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Y96016E8bXNLkrNR .error-icon{fill:#552222;}#mermaid-svg-Y96016E8bXNLkrNR .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Y96016E8bXNLkrNR .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Y96016E8bXNLkrNR .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Y96016E8bXNLkrNR .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Y96016E8bXNLkrNR .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Y96016E8bXNLkrNR .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Y96016E8bXNLkrNR .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Y96016E8bXNLkrNR .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Y96016E8bXNLkrNR .marker.cross{stroke:#333333;}#mermaid-svg-Y96016E8bXNLkrNR svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Y96016E8bXNLkrNR p{margin:0;}#mermaid-svg-Y96016E8bXNLkrNR .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-Y96016E8bXNLkrNR .cluster-label text{fill:#333;}#mermaid-svg-Y96016E8bXNLkrNR .cluster-label span{color:#333;}#mermaid-svg-Y96016E8bXNLkrNR .cluster-label span p{background-color:transparent;}#mermaid-svg-Y96016E8bXNLkrNR .label text,#mermaid-svg-Y96016E8bXNLkrNR span{fill:#333;color:#333;}#mermaid-svg-Y96016E8bXNLkrNR .node rect,#mermaid-svg-Y96016E8bXNLkrNR .node circle,#mermaid-svg-Y96016E8bXNLkrNR .node ellipse,#mermaid-svg-Y96016E8bXNLkrNR .node polygon,#mermaid-svg-Y96016E8bXNLkrNR .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Y96016E8bXNLkrNR .rough-node .label text,#mermaid-svg-Y96016E8bXNLkrNR .node .label text,#mermaid-svg-Y96016E8bXNLkrNR .image-shape .label,#mermaid-svg-Y96016E8bXNLkrNR .icon-shape .label{text-anchor:middle;}#mermaid-svg-Y96016E8bXNLkrNR .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Y96016E8bXNLkrNR .rough-node .label,#mermaid-svg-Y96016E8bXNLkrNR .node .label,#mermaid-svg-Y96016E8bXNLkrNR .image-shape .label,#mermaid-svg-Y96016E8bXNLkrNR .icon-shape .label{text-align:center;}#mermaid-svg-Y96016E8bXNLkrNR .node.clickable{cursor:pointer;}#mermaid-svg-Y96016E8bXNLkrNR .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Y96016E8bXNLkrNR .arrowheadPath{fill:#333333;}#mermaid-svg-Y96016E8bXNLkrNR .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Y96016E8bXNLkrNR .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Y96016E8bXNLkrNR .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Y96016E8bXNLkrNR .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Y96016E8bXNLkrNR .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Y96016E8bXNLkrNR .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Y96016E8bXNLkrNR .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Y96016E8bXNLkrNR .cluster text{fill:#333;}#mermaid-svg-Y96016E8bXNLkrNR .cluster span{color:#333;}#mermaid-svg-Y96016E8bXNLkrNR div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Y96016E8bXNLkrNR .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Y96016E8bXNLkrNR rect.text{fill:none;stroke-width:0;}#mermaid-svg-Y96016E8bXNLkrNR .icon-shape,#mermaid-svg-Y96016E8bXNLkrNR .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Y96016E8bXNLkrNR .icon-shape p,#mermaid-svg-Y96016E8bXNLkrNR .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Y96016E8bXNLkrNR .icon-shape rect,#mermaid-svg-Y96016E8bXNLkrNR .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Y96016E8bXNLkrNR .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Y96016E8bXNLkrNR .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Y96016E8bXNLkrNR :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
加载后
加载中
加载前
空目录
1. 移动文件
源文件/home/hadoop/data.txt
仓库目录/user/hive/warehouse/
inner_table目录
LOAD DATA命令
inner_table目录/user/hive/warehouse/xt.db/inner_table
data.txt文件被移动到此
文件系统变化:
# 加载前
$ hdfs dfs -ls /home/hadoop/
-rw-r–r– /home/hadoop/data.txt # 源文件存在
$ hdfs dfs -ls /user/hive/warehouse/xt.db/inner_table/
# 空目录
# 执行LOAD DATA后
$ hdfs dfs -ls /home/hadoop/
# 源文件已消失!
$ hdfs dfs -ls /user/hive/warehouse/xt.db/inner_table/
-rw-r–r– /user/hive/warehouse/xt.db/inner_table/data.txt
# 文件被移动到仓库目录
关键结论:内部表加载数据是物理移动操作,源文件不复存在。
2.2 外部表创建过程
— 创建外部表
CREATE EXTERNAL TABLE external_table (
id INT,
name STRING,
age INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LOCATION '/data/raw/user_logs'; — 指定外部路径
— 或者先有数据,再建表
CREATE EXTERNAL TABLE access_log (
ip STRING,
url STRING,
access_time STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ' '
LOCATION '/data/nginx/logs'; — 目录下已有数据文件
外部表创建的背后:
#mermaid-svg-rgnX11K1WxZEy3iD{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-rgnX11K1WxZEy3iD .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-rgnX11K1WxZEy3iD .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-rgnX11K1WxZEy3iD .error-icon{fill:#552222;}#mermaid-svg-rgnX11K1WxZEy3iD .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-rgnX11K1WxZEy3iD .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-rgnX11K1WxZEy3iD .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-rgnX11K1WxZEy3iD .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-rgnX11K1WxZEy3iD .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-rgnX11K1WxZEy3iD .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-rgnX11K1WxZEy3iD .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-rgnX11K1WxZEy3iD .marker{fill:#333333;stroke:#333333;}#mermaid-svg-rgnX11K1WxZEy3iD .marker.cross{stroke:#333333;}#mermaid-svg-rgnX11K1WxZEy3iD svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-rgnX11K1WxZEy3iD p{margin:0;}#mermaid-svg-rgnX11K1WxZEy3iD .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-rgnX11K1WxZEy3iD .cluster-label text{fill:#333;}#mermaid-svg-rgnX11K1WxZEy3iD .cluster-label span{color:#333;}#mermaid-svg-rgnX11K1WxZEy3iD .cluster-label span p{background-color:transparent;}#mermaid-svg-rgnX11K1WxZEy3iD .label text,#mermaid-svg-rgnX11K1WxZEy3iD span{fill:#333;color:#333;}#mermaid-svg-rgnX11K1WxZEy3iD .node rect,#mermaid-svg-rgnX11K1WxZEy3iD .node circle,#mermaid-svg-rgnX11K1WxZEy3iD .node ellipse,#mermaid-svg-rgnX11K1WxZEy3iD .node polygon,#mermaid-svg-rgnX11K1WxZEy3iD .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-rgnX11K1WxZEy3iD .rough-node .label text,#mermaid-svg-rgnX11K1WxZEy3iD .node .label text,#mermaid-svg-rgnX11K1WxZEy3iD .image-shape .label,#mermaid-svg-rgnX11K1WxZEy3iD .icon-shape .label{text-anchor:middle;}#mermaid-svg-rgnX11K1WxZEy3iD .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-rgnX11K1WxZEy3iD .rough-node .label,#mermaid-svg-rgnX11K1WxZEy3iD .node .label,#mermaid-svg-rgnX11K1WxZEy3iD .image-shape .label,#mermaid-svg-rgnX11K1WxZEy3iD .icon-shape .label{text-align:center;}#mermaid-svg-rgnX11K1WxZEy3iD .node.clickable{cursor:pointer;}#mermaid-svg-rgnX11K1WxZEy3iD .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-rgnX11K1WxZEy3iD .arrowheadPath{fill:#333333;}#mermaid-svg-rgnX11K1WxZEy3iD .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-rgnX11K1WxZEy3iD .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-rgnX11K1WxZEy3iD .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-rgnX11K1WxZEy3iD .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-rgnX11K1WxZEy3iD .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-rgnX11K1WxZEy3iD .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-rgnX11K1WxZEy3iD .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-rgnX11K1WxZEy3iD .cluster text{fill:#333;}#mermaid-svg-rgnX11K1WxZEy3iD .cluster span{color:#333;}#mermaid-svg-rgnX11K1WxZEy3iD div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-rgnX11K1WxZEy3iD .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-rgnX11K1WxZEy3iD rect.text{fill:none;stroke-width:0;}#mermaid-svg-rgnX11K1WxZEy3iD .icon-shape,#mermaid-svg-rgnX11K1WxZEy3iD .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-rgnX11K1WxZEy3iD .icon-shape p,#mermaid-svg-rgnX11K1WxZEy3iD .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-rgnX11K1WxZEy3iD .icon-shape rect,#mermaid-svg-rgnX11K1WxZEy3iD .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-rgnX11K1WxZEy3iD .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-rgnX11K1WxZEy3iD .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-rgnX11K1WxZEy3iD :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
建表后
创建外部表
数据已存在
CREATE EXTERNAL TABLELOCATION '/data/raw/user_logs'
记录路径信息不移动数据
保持不变
查询时读取
数据目录/data/raw/user_logs
part-00000
part-00001
part-00002
Hive
元数据库
Record
文件仍在原处
文件系统变化:
# 数据文件已存在
$ hdfs dfs -ls /data/raw/user_logs/
-rw-r–r– /data/raw/user_logs/part-00000
-rw-r–r– /data/raw/user_logs/part-00001
-rw-r–r– /data/raw/user_logs/part-00002
# 创建外部表后
$ hdfs dfs -ls /user/hive/warehouse/xt.db/
# 没有external_table目录!
$ hdfs dfs -ls /data/raw/user_logs/
# 文件还在原地,纹丝不动
关键结论:外部表只记录路径,数据原地不动,Hive只是"看门人"。
三、删除表时的行为差异
3.1 内部表删除
— 删除内部表
DROP TABLE inner_table;
#mermaid-svg-9ZLwH0at5Xl7lZ3m{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-9ZLwH0at5Xl7lZ3m .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .error-icon{fill:#552222;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .marker{fill:#333333;stroke:#333333;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .marker.cross{stroke:#333333;}#mermaid-svg-9ZLwH0at5Xl7lZ3m svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-9ZLwH0at5Xl7lZ3m p{margin:0;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .cluster-label text{fill:#333;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .cluster-label span{color:#333;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .cluster-label span p{background-color:transparent;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .label text,#mermaid-svg-9ZLwH0at5Xl7lZ3m span{fill:#333;color:#333;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .node rect,#mermaid-svg-9ZLwH0at5Xl7lZ3m .node circle,#mermaid-svg-9ZLwH0at5Xl7lZ3m .node ellipse,#mermaid-svg-9ZLwH0at5Xl7lZ3m .node polygon,#mermaid-svg-9ZLwH0at5Xl7lZ3m .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .rough-node .label text,#mermaid-svg-9ZLwH0at5Xl7lZ3m .node .label text,#mermaid-svg-9ZLwH0at5Xl7lZ3m .image-shape .label,#mermaid-svg-9ZLwH0at5Xl7lZ3m .icon-shape .label{text-anchor:middle;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .rough-node .label,#mermaid-svg-9ZLwH0at5Xl7lZ3m .node .label,#mermaid-svg-9ZLwH0at5Xl7lZ3m .image-shape .label,#mermaid-svg-9ZLwH0at5Xl7lZ3m .icon-shape .label{text-align:center;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .node.clickable{cursor:pointer;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .arrowheadPath{fill:#333333;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-9ZLwH0at5Xl7lZ3m .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-9ZLwH0at5Xl7lZ3m .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-9ZLwH0at5Xl7lZ3m .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .cluster text{fill:#333;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .cluster span{color:#333;}#mermaid-svg-9ZLwH0at5Xl7lZ3m div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-9ZLwH0at5Xl7lZ3m rect.text{fill:none;stroke-width:0;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .icon-shape,#mermaid-svg-9ZLwH0at5Xl7lZ3m .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .icon-shape p,#mermaid-svg-9ZLwH0at5Xl7lZ3m .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .icon-shape rect,#mermaid-svg-9ZLwH0at5Xl7lZ3m .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-9ZLwH0at5Xl7lZ3m .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-9ZLwH0at5Xl7lZ3m .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-9ZLwH0at5Xl7lZ3m :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
删除后
删除中
删除前
元数据inner_table存在
数据文件仓库目录下
DROP TABLE命令
元数据inner_table已删除
数据文件已被删除
如果开启回收站文件移动到/user/用户名/.Trash
文件系统变化:
# 删除前
$ hdfs dfs -ls /user/hive/warehouse/xt.db/inner_table/
-rw-r–r– /user/hive/warehouse/xt.db/inner_table/data.txt
# 执行DROP TABLE后
$ hdfs dfs -ls /user/hive/warehouse/xt.db/inner_table/
# 目录不存在了!
$ hdfs dfs -ls /user/hive/warehouse/xt.db/
# inner_table目录整个被删除
# 如果开启回收站
$ hdfs dfs -ls /user/hadoop/.Trash/Current/user/hive/warehouse/xt.db/
# 可以在回收站找到
3.2 外部表删除
— 删除外部表
DROP TABLE external_table;
#mermaid-svg-3eEuygnAuKVpZ1i5{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-3eEuygnAuKVpZ1i5 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-3eEuygnAuKVpZ1i5 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-3eEuygnAuKVpZ1i5 .error-icon{fill:#552222;}#mermaid-svg-3eEuygnAuKVpZ1i5 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-3eEuygnAuKVpZ1i5 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-3eEuygnAuKVpZ1i5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-3eEuygnAuKVpZ1i5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-3eEuygnAuKVpZ1i5 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-3eEuygnAuKVpZ1i5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-3eEuygnAuKVpZ1i5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-3eEuygnAuKVpZ1i5 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-3eEuygnAuKVpZ1i5 .marker.cross{stroke:#333333;}#mermaid-svg-3eEuygnAuKVpZ1i5 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-3eEuygnAuKVpZ1i5 p{margin:0;}#mermaid-svg-3eEuygnAuKVpZ1i5 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-3eEuygnAuKVpZ1i5 .cluster-label text{fill:#333;}#mermaid-svg-3eEuygnAuKVpZ1i5 .cluster-label span{color:#333;}#mermaid-svg-3eEuygnAuKVpZ1i5 .cluster-label span p{background-color:transparent;}#mermaid-svg-3eEuygnAuKVpZ1i5 .label text,#mermaid-svg-3eEuygnAuKVpZ1i5 span{fill:#333;color:#333;}#mermaid-svg-3eEuygnAuKVpZ1i5 .node rect,#mermaid-svg-3eEuygnAuKVpZ1i5 .node circle,#mermaid-svg-3eEuygnAuKVpZ1i5 .node ellipse,#mermaid-svg-3eEuygnAuKVpZ1i5 .node polygon,#mermaid-svg-3eEuygnAuKVpZ1i5 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-3eEuygnAuKVpZ1i5 .rough-node .label text,#mermaid-svg-3eEuygnAuKVpZ1i5 .node .label text,#mermaid-svg-3eEuygnAuKVpZ1i5 .image-shape .label,#mermaid-svg-3eEuygnAuKVpZ1i5 .icon-shape .label{text-anchor:middle;}#mermaid-svg-3eEuygnAuKVpZ1i5 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-3eEuygnAuKVpZ1i5 .rough-node .label,#mermaid-svg-3eEuygnAuKVpZ1i5 .node .label,#mermaid-svg-3eEuygnAuKVpZ1i5 .image-shape .label,#mermaid-svg-3eEuygnAuKVpZ1i5 .icon-shape .label{text-align:center;}#mermaid-svg-3eEuygnAuKVpZ1i5 .node.clickable{cursor:pointer;}#mermaid-svg-3eEuygnAuKVpZ1i5 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-3eEuygnAuKVpZ1i5 .arrowheadPath{fill:#333333;}#mermaid-svg-3eEuygnAuKVpZ1i5 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-3eEuygnAuKVpZ1i5 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-3eEuygnAuKVpZ1i5 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3eEuygnAuKVpZ1i5 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-3eEuygnAuKVpZ1i5 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3eEuygnAuKVpZ1i5 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-3eEuygnAuKVpZ1i5 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-3eEuygnAuKVpZ1i5 .cluster text{fill:#333;}#mermaid-svg-3eEuygnAuKVpZ1i5 .cluster span{color:#333;}#mermaid-svg-3eEuygnAuKVpZ1i5 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-3eEuygnAuKVpZ1i5 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-3eEuygnAuKVpZ1i5 rect.text{fill:none;stroke-width:0;}#mermaid-svg-3eEuygnAuKVpZ1i5 .icon-shape,#mermaid-svg-3eEuygnAuKVpZ1i5 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3eEuygnAuKVpZ1i5 .icon-shape p,#mermaid-svg-3eEuygnAuKVpZ1i5 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-3eEuygnAuKVpZ1i5 .icon-shape rect,#mermaid-svg-3eEuygnAuKVpZ1i5 .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3eEuygnAuKVpZ1i5 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-3eEuygnAuKVpZ1i5 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-3eEuygnAuKVpZ1i5 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
删除后
删除中
删除前
不受影响
元数据external_table存在
数据文件/data/raw/user_logs/
DROP TABLE命令
元数据external_table已删除
数据文件完好无损
文件系统变化:
# 删除前
$ hdfs dfs -ls /data/raw/user_logs/
-rw-r–r– /data/raw/user_logs/part-00000
-rw-r–r– /data/raw/user_logs/part-00001
# 执行DROP TABLE后
$ hive> DROP TABLE external_table;
OK
Time taken: 0.1 seconds
$ hdfs dfs -ls /data/raw/user_logs/
-rw-r–r– /data/raw/user_logs/part-00000
-rw-r–r– /data/raw/user_logs/part-00001
# 数据文件完好无损!
关键结论:外部表删除只是"忘了"数据的位置,数据本身毫发无伤。
四、本质区别:谁拥有数据?
4.1 生命周期管理对比
#mermaid-svg-aGFtFoORfAvocHhN{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-aGFtFoORfAvocHhN .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-aGFtFoORfAvocHhN .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-aGFtFoORfAvocHhN .error-icon{fill:#552222;}#mermaid-svg-aGFtFoORfAvocHhN .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-aGFtFoORfAvocHhN .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-aGFtFoORfAvocHhN .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-aGFtFoORfAvocHhN .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-aGFtFoORfAvocHhN .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-aGFtFoORfAvocHhN .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-aGFtFoORfAvocHhN .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-aGFtFoORfAvocHhN .marker{fill:#333333;stroke:#333333;}#mermaid-svg-aGFtFoORfAvocHhN .marker.cross{stroke:#333333;}#mermaid-svg-aGFtFoORfAvocHhN svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-aGFtFoORfAvocHhN p{margin:0;}#mermaid-svg-aGFtFoORfAvocHhN .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-aGFtFoORfAvocHhN .cluster-label text{fill:#333;}#mermaid-svg-aGFtFoORfAvocHhN .cluster-label span{color:#333;}#mermaid-svg-aGFtFoORfAvocHhN .cluster-label span p{background-color:transparent;}#mermaid-svg-aGFtFoORfAvocHhN .label text,#mermaid-svg-aGFtFoORfAvocHhN span{fill:#333;color:#333;}#mermaid-svg-aGFtFoORfAvocHhN .node rect,#mermaid-svg-aGFtFoORfAvocHhN .node circle,#mermaid-svg-aGFtFoORfAvocHhN .node ellipse,#mermaid-svg-aGFtFoORfAvocHhN .node polygon,#mermaid-svg-aGFtFoORfAvocHhN .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-aGFtFoORfAvocHhN .rough-node .label text,#mermaid-svg-aGFtFoORfAvocHhN .node .label text,#mermaid-svg-aGFtFoORfAvocHhN .image-shape .label,#mermaid-svg-aGFtFoORfAvocHhN .icon-shape .label{text-anchor:middle;}#mermaid-svg-aGFtFoORfAvocHhN .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-aGFtFoORfAvocHhN .rough-node .label,#mermaid-svg-aGFtFoORfAvocHhN .node .label,#mermaid-svg-aGFtFoORfAvocHhN .image-shape .label,#mermaid-svg-aGFtFoORfAvocHhN .icon-shape .label{text-align:center;}#mermaid-svg-aGFtFoORfAvocHhN .node.clickable{cursor:pointer;}#mermaid-svg-aGFtFoORfAvocHhN .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-aGFtFoORfAvocHhN .arrowheadPath{fill:#333333;}#mermaid-svg-aGFtFoORfAvocHhN .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-aGFtFoORfAvocHhN .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-aGFtFoORfAvocHhN .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-aGFtFoORfAvocHhN .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-aGFtFoORfAvocHhN .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-aGFtFoORfAvocHhN .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-aGFtFoORfAvocHhN .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-aGFtFoORfAvocHhN .cluster text{fill:#333;}#mermaid-svg-aGFtFoORfAvocHhN .cluster span{color:#333;}#mermaid-svg-aGFtFoORfAvocHhN div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-aGFtFoORfAvocHhN .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-aGFtFoORfAvocHhN rect.text{fill:none;stroke-width:0;}#mermaid-svg-aGFtFoORfAvocHhN .icon-shape,#mermaid-svg-aGFtFoORfAvocHhN .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-aGFtFoORfAvocHhN .icon-shape p,#mermaid-svg-aGFtFoORfAvocHhN .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-aGFtFoORfAvocHhN .icon-shape rect,#mermaid-svg-aGFtFoORfAvocHhN .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-aGFtFoORfAvocHhN .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-aGFtFoORfAvocHhN .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-aGFtFoORfAvocHhN :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
Hive 内部表 vs 外部表生命周期对比
外部表 (External Table)
🌍 外部表 – Hive只管理元数据
外部系统产生数据
数据写入HDFS任意目录
CREATE EXTERNAL TABLE指定LOCATION
Hive记录元数据数据位置/格式
查询使用SELECT操作
DROP TABLE删除表
✅ 元数据删除❌ 数据保留在HDFS
其他系统可继续使用
特点:• Hive只管理元数据• 删除表不影响数据• 适合共享数据/原始数据
内部表 (Managed Table)
🏠 内部表 – Hive管理数据和元数据
CREATE TABLE创建表
LOAD DATA加载数据到Hive目录
数据移动到/user/hive/warehouse/
查询使用SELECT操作
DROP TABLE删除表
✅ 数据和元数据全部删除
特点:• Hive完全控制数据• 删除表时数据也删除• 适合临时表/ETL中间表
4.2 数据所有权对比
| 谁产生数据 | Hive自己 | 外部系统(Flume、Kafka等) |
| 谁管理数据 | Hive全权管理 | 外部系统或HDFS |
| 数据生命周期 | 与表绑定 | 独立于表 |
| 删除影响 | 数据随表消失 | 数据永存 |
| 数据共享 | 困难(数据在Hive仓库) | 容易(数据在公共区域) |
五、使用场景深度分析
5.1 外部表适用场景
#mermaid-svg-x6eopTRg14xo1aF8{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-x6eopTRg14xo1aF8 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-x6eopTRg14xo1aF8 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-x6eopTRg14xo1aF8 .error-icon{fill:#552222;}#mermaid-svg-x6eopTRg14xo1aF8 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-x6eopTRg14xo1aF8 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-x6eopTRg14xo1aF8 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-x6eopTRg14xo1aF8 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-x6eopTRg14xo1aF8 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-x6eopTRg14xo1aF8 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-x6eopTRg14xo1aF8 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-x6eopTRg14xo1aF8 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-x6eopTRg14xo1aF8 .marker.cross{stroke:#333333;}#mermaid-svg-x6eopTRg14xo1aF8 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-x6eopTRg14xo1aF8 p{margin:0;}#mermaid-svg-x6eopTRg14xo1aF8 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-x6eopTRg14xo1aF8 .cluster-label text{fill:#333;}#mermaid-svg-x6eopTRg14xo1aF8 .cluster-label span{color:#333;}#mermaid-svg-x6eopTRg14xo1aF8 .cluster-label span p{background-color:transparent;}#mermaid-svg-x6eopTRg14xo1aF8 .label text,#mermaid-svg-x6eopTRg14xo1aF8 span{fill:#333;color:#333;}#mermaid-svg-x6eopTRg14xo1aF8 .node rect,#mermaid-svg-x6eopTRg14xo1aF8 .node circle,#mermaid-svg-x6eopTRg14xo1aF8 .node ellipse,#mermaid-svg-x6eopTRg14xo1aF8 .node polygon,#mermaid-svg-x6eopTRg14xo1aF8 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-x6eopTRg14xo1aF8 .rough-node .label text,#mermaid-svg-x6eopTRg14xo1aF8 .node .label text,#mermaid-svg-x6eopTRg14xo1aF8 .image-shape .label,#mermaid-svg-x6eopTRg14xo1aF8 .icon-shape .label{text-anchor:middle;}#mermaid-svg-x6eopTRg14xo1aF8 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-x6eopTRg14xo1aF8 .rough-node .label,#mermaid-svg-x6eopTRg14xo1aF8 .node .label,#mermaid-svg-x6eopTRg14xo1aF8 .image-shape .label,#mermaid-svg-x6eopTRg14xo1aF8 .icon-shape .label{text-align:center;}#mermaid-svg-x6eopTRg14xo1aF8 .node.clickable{cursor:pointer;}#mermaid-svg-x6eopTRg14xo1aF8 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-x6eopTRg14xo1aF8 .arrowheadPath{fill:#333333;}#mermaid-svg-x6eopTRg14xo1aF8 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-x6eopTRg14xo1aF8 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-x6eopTRg14xo1aF8 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-x6eopTRg14xo1aF8 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-x6eopTRg14xo1aF8 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-x6eopTRg14xo1aF8 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-x6eopTRg14xo1aF8 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-x6eopTRg14xo1aF8 .cluster text{fill:#333;}#mermaid-svg-x6eopTRg14xo1aF8 .cluster span{color:#333;}#mermaid-svg-x6eopTRg14xo1aF8 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-x6eopTRg14xo1aF8 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-x6eopTRg14xo1aF8 rect.text{fill:none;stroke-width:0;}#mermaid-svg-x6eopTRg14xo1aF8 .icon-shape,#mermaid-svg-x6eopTRg14xo1aF8 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-x6eopTRg14xo1aF8 .icon-shape p,#mermaid-svg-x6eopTRg14xo1aF8 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-x6eopTRg14xo1aF8 .icon-shape rect,#mermaid-svg-x6eopTRg14xo1aF8 .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-x6eopTRg14xo1aF8 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-x6eopTRg14xo1aF8 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-x6eopTRg14xo1aF8 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
数据消费
数据生产
创建外部表
创建外部表
创建外部表
Flume采集日志
data/logs/nginx
Kafka消息
data/kafka/events
业务数据库
data/mysql/export
Hive日志分析
Hive实时处理
Hive数据仓库
Spark SQL
Presto查询
Impala分析
典型场景1:原始数据层(ODS)
— 日志数据:由Flume实时写入HDFS
CREATE EXTERNAL TABLE ods_nginx_log (
ip STRING,
access_time STRING,
method STRING,
url STRING,
status INT,
user_agent STRING
)
PARTITIONED BY (dt STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "([^ ]*) – – \\\\[([^]]*)\\\\] \\"([^ ]*) ([^ ]*) [^ ]*\\" ([0-9]*) .* \\"([^\\"]*)\\""
)
LOCATION '/data/logs/nginx/'; — Flume写入的目录
— 即使删除这个表,原始日志文件依然在,不影响其他系统使用
典型场景2:共享数据层
— 清洗后的数据,供多个团队使用
CREATE EXTERNAL TABLE dwd_user_behavior (
user_id STRING,
behavior_type STRING,
item_id STRING,
behavior_time TIMESTAMP
)
PARTITIONED BY (dt STRING)
STORED AS PARQUET
LOCATION '/data/warehouse/dwd/user_behavior/';
— 数据由ETL团队负责维护
— 分析团队只需要建表查询,不用担心误删数据
5.2 内部表适用场景
#mermaid-svg-Zif4fDrnJAyhqsax{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Zif4fDrnJAyhqsax .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Zif4fDrnJAyhqsax .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Zif4fDrnJAyhqsax .error-icon{fill:#552222;}#mermaid-svg-Zif4fDrnJAyhqsax .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Zif4fDrnJAyhqsax .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Zif4fDrnJAyhqsax .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Zif4fDrnJAyhqsax .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Zif4fDrnJAyhqsax .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Zif4fDrnJAyhqsax .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Zif4fDrnJAyhqsax .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Zif4fDrnJAyhqsax .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Zif4fDrnJAyhqsax .marker.cross{stroke:#333333;}#mermaid-svg-Zif4fDrnJAyhqsax svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Zif4fDrnJAyhqsax p{margin:0;}#mermaid-svg-Zif4fDrnJAyhqsax .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-Zif4fDrnJAyhqsax .cluster-label text{fill:#333;}#mermaid-svg-Zif4fDrnJAyhqsax .cluster-label span{color:#333;}#mermaid-svg-Zif4fDrnJAyhqsax .cluster-label span p{background-color:transparent;}#mermaid-svg-Zif4fDrnJAyhqsax .label text,#mermaid-svg-Zif4fDrnJAyhqsax span{fill:#333;color:#333;}#mermaid-svg-Zif4fDrnJAyhqsax .node rect,#mermaid-svg-Zif4fDrnJAyhqsax .node circle,#mermaid-svg-Zif4fDrnJAyhqsax .node ellipse,#mermaid-svg-Zif4fDrnJAyhqsax .node polygon,#mermaid-svg-Zif4fDrnJAyhqsax .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Zif4fDrnJAyhqsax .rough-node .label text,#mermaid-svg-Zif4fDrnJAyhqsax .node .label text,#mermaid-svg-Zif4fDrnJAyhqsax .image-shape .label,#mermaid-svg-Zif4fDrnJAyhqsax .icon-shape .label{text-anchor:middle;}#mermaid-svg-Zif4fDrnJAyhqsax .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Zif4fDrnJAyhqsax .rough-node .label,#mermaid-svg-Zif4fDrnJAyhqsax .node .label,#mermaid-svg-Zif4fDrnJAyhqsax .image-shape .label,#mermaid-svg-Zif4fDrnJAyhqsax .icon-shape .label{text-align:center;}#mermaid-svg-Zif4fDrnJAyhqsax .node.clickable{cursor:pointer;}#mermaid-svg-Zif4fDrnJAyhqsax .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Zif4fDrnJAyhqsax .arrowheadPath{fill:#333333;}#mermaid-svg-Zif4fDrnJAyhqsax .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Zif4fDrnJAyhqsax .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Zif4fDrnJAyhqsax .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Zif4fDrnJAyhqsax .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Zif4fDrnJAyhqsax .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Zif4fDrnJAyhqsax .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Zif4fDrnJAyhqsax .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Zif4fDrnJAyhqsax .cluster text{fill:#333;}#mermaid-svg-Zif4fDrnJAyhqsax .cluster span{color:#333;}#mermaid-svg-Zif4fDrnJAyhqsax div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Zif4fDrnJAyhqsax .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Zif4fDrnJAyhqsax rect.text{fill:none;stroke-width:0;}#mermaid-svg-Zif4fDrnJAyhqsax .icon-shape,#mermaid-svg-Zif4fDrnJAyhqsax .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Zif4fDrnJAyhqsax .icon-shape p,#mermaid-svg-Zif4fDrnJAyhqsax .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Zif4fDrnJAyhqsax .icon-shape rect,#mermaid-svg-Zif4fDrnJAyhqsax .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Zif4fDrnJAyhqsax .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Zif4fDrnJAyhqsax .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Zif4fDrnJAyhqsax :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
数据生命周期
ETL过程
清洗转换
聚合计算
最终计算
报表展示
导出
完成后
ODS外部表
临时内部表
中间内部表
结果内部表
BI系统
MySQL
删除内部表自动清理数据
典型场景1:中间表
— ETL过程中的临时表,用完即弃
CREATE TABLE temp_etl_step1 AS
SELECT
user_id,
COUNT(*) AS click_count,
SUM(CASE WHEN purchase=1 THEN 1 ELSE 0 END) AS purchase_count
FROM ods_user_behavior
WHERE dt = '2024-01-15'
GROUP BY user_id;
— 下一步ETL使用这个中间表
CREATE TABLE temp_etl_step2 AS
SELECT
t1.user_id,
t1.click_count,
t1.purchase_count,
t2.user_info
FROM temp_etl_step1 t1
JOIN dwd_user_info t2 ON t1.user_id = t2.user_id;
— 任务完成后,删除中间表(数据自动清理)
DROP TABLE temp_etl_step1;
DROP TABLE temp_etl_step2;
典型场景2:结果表
— 报表结果表,Hive完全管理
CREATE TABLE report_daily_active_users
STORED AS ORC
AS
SELECT
dt,
COUNT(DISTINCT user_id) AS dau,
COUNT(DISTINCT CASE WHEN behavior='purchase' THEN user_id END) AS paying_users
FROM ods_user_behavior
GROUP BY dt;
— 每天分区覆盖更新
INSERT OVERWRITE TABLE report_daily_active_users
PARTITION (dt='2024-01-16')
SELECT ...;
— 如果报表逻辑变更,可以删除旧表重建
DROP TABLE report_daily_active_users; — 数据和表一起消失
5.3 场景选择决策树
#mermaid-svg-uWCCAQ5qZj3TajzU{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-uWCCAQ5qZj3TajzU .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-uWCCAQ5qZj3TajzU .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-uWCCAQ5qZj3TajzU .error-icon{fill:#552222;}#mermaid-svg-uWCCAQ5qZj3TajzU .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-uWCCAQ5qZj3TajzU .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-uWCCAQ5qZj3TajzU .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-uWCCAQ5qZj3TajzU .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-uWCCAQ5qZj3TajzU .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-uWCCAQ5qZj3TajzU .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-uWCCAQ5qZj3TajzU .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-uWCCAQ5qZj3TajzU .marker{fill:#333333;stroke:#333333;}#mermaid-svg-uWCCAQ5qZj3TajzU .marker.cross{stroke:#333333;}#mermaid-svg-uWCCAQ5qZj3TajzU svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-uWCCAQ5qZj3TajzU p{margin:0;}#mermaid-svg-uWCCAQ5qZj3TajzU .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-uWCCAQ5qZj3TajzU .cluster-label text{fill:#333;}#mermaid-svg-uWCCAQ5qZj3TajzU .cluster-label span{color:#333;}#mermaid-svg-uWCCAQ5qZj3TajzU .cluster-label span p{background-color:transparent;}#mermaid-svg-uWCCAQ5qZj3TajzU .label text,#mermaid-svg-uWCCAQ5qZj3TajzU span{fill:#333;color:#333;}#mermaid-svg-uWCCAQ5qZj3TajzU .node rect,#mermaid-svg-uWCCAQ5qZj3TajzU .node circle,#mermaid-svg-uWCCAQ5qZj3TajzU .node ellipse,#mermaid-svg-uWCCAQ5qZj3TajzU .node polygon,#mermaid-svg-uWCCAQ5qZj3TajzU .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-uWCCAQ5qZj3TajzU .rough-node .label text,#mermaid-svg-uWCCAQ5qZj3TajzU .node .label text,#mermaid-svg-uWCCAQ5qZj3TajzU .image-shape .label,#mermaid-svg-uWCCAQ5qZj3TajzU .icon-shape .label{text-anchor:middle;}#mermaid-svg-uWCCAQ5qZj3TajzU .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-uWCCAQ5qZj3TajzU .rough-node .label,#mermaid-svg-uWCCAQ5qZj3TajzU .node .label,#mermaid-svg-uWCCAQ5qZj3TajzU .image-shape .label,#mermaid-svg-uWCCAQ5qZj3TajzU .icon-shape .label{text-align:center;}#mermaid-svg-uWCCAQ5qZj3TajzU .node.clickable{cursor:pointer;}#mermaid-svg-uWCCAQ5qZj3TajzU .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-uWCCAQ5qZj3TajzU .arrowheadPath{fill:#333333;}#mermaid-svg-uWCCAQ5qZj3TajzU .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-uWCCAQ5qZj3TajzU .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-uWCCAQ5qZj3TajzU .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uWCCAQ5qZj3TajzU .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-uWCCAQ5qZj3TajzU .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uWCCAQ5qZj3TajzU .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-uWCCAQ5qZj3TajzU .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-uWCCAQ5qZj3TajzU .cluster text{fill:#333;}#mermaid-svg-uWCCAQ5qZj3TajzU .cluster span{color:#333;}#mermaid-svg-uWCCAQ5qZj3TajzU div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-uWCCAQ5qZj3TajzU .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-uWCCAQ5qZj3TajzU rect.text{fill:none;stroke-width:0;}#mermaid-svg-uWCCAQ5qZj3TajzU .icon-shape,#mermaid-svg-uWCCAQ5qZj3TajzU .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uWCCAQ5qZj3TajzU .icon-shape p,#mermaid-svg-uWCCAQ5qZj3TajzU .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-uWCCAQ5qZj3TajzU .icon-shape rect,#mermaid-svg-uWCCAQ5qZj3TajzU .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uWCCAQ5qZj3TajzU .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-uWCCAQ5qZj3TajzU .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-uWCCAQ5qZj3TajzU :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
外部系统产生日志/采集/导入
Hive自己产生ETL结果
临时中间数据
最终结果数据
多个系统使用
仅供本流程使用
创建Hive表
数据来源?
使用外部表
数据用途?
内部表用完即弃
是否需要共享?
外部表方便共享
内部表Hive管理
六、混合使用的最佳实践
6.1 分层设计中的表类型选择
#mermaid-svg-ykbvUSGE8UFJepAg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ykbvUSGE8UFJepAg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ykbvUSGE8UFJepAg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ykbvUSGE8UFJepAg .error-icon{fill:#552222;}#mermaid-svg-ykbvUSGE8UFJepAg .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ykbvUSGE8UFJepAg .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ykbvUSGE8UFJepAg .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ykbvUSGE8UFJepAg .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ykbvUSGE8UFJepAg .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ykbvUSGE8UFJepAg .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ykbvUSGE8UFJepAg .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ykbvUSGE8UFJepAg .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ykbvUSGE8UFJepAg .marker.cross{stroke:#333333;}#mermaid-svg-ykbvUSGE8UFJepAg svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ykbvUSGE8UFJepAg p{margin:0;}#mermaid-svg-ykbvUSGE8UFJepAg .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-ykbvUSGE8UFJepAg .cluster-label text{fill:#333;}#mermaid-svg-ykbvUSGE8UFJepAg .cluster-label span{color:#333;}#mermaid-svg-ykbvUSGE8UFJepAg .cluster-label span p{background-color:transparent;}#mermaid-svg-ykbvUSGE8UFJepAg .label text,#mermaid-svg-ykbvUSGE8UFJepAg span{fill:#333;color:#333;}#mermaid-svg-ykbvUSGE8UFJepAg .node rect,#mermaid-svg-ykbvUSGE8UFJepAg .node circle,#mermaid-svg-ykbvUSGE8UFJepAg .node ellipse,#mermaid-svg-ykbvUSGE8UFJepAg .node polygon,#mermaid-svg-ykbvUSGE8UFJepAg .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ykbvUSGE8UFJepAg .rough-node .label text,#mermaid-svg-ykbvUSGE8UFJepAg .node .label text,#mermaid-svg-ykbvUSGE8UFJepAg .image-shape .label,#mermaid-svg-ykbvUSGE8UFJepAg .icon-shape .label{text-anchor:middle;}#mermaid-svg-ykbvUSGE8UFJepAg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ykbvUSGE8UFJepAg .rough-node .label,#mermaid-svg-ykbvUSGE8UFJepAg .node .label,#mermaid-svg-ykbvUSGE8UFJepAg .image-shape .label,#mermaid-svg-ykbvUSGE8UFJepAg .icon-shape .label{text-align:center;}#mermaid-svg-ykbvUSGE8UFJepAg .node.clickable{cursor:pointer;}#mermaid-svg-ykbvUSGE8UFJepAg .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ykbvUSGE8UFJepAg .arrowheadPath{fill:#333333;}#mermaid-svg-ykbvUSGE8UFJepAg .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ykbvUSGE8UFJepAg .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ykbvUSGE8UFJepAg .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ykbvUSGE8UFJepAg .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ykbvUSGE8UFJepAg .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ykbvUSGE8UFJepAg .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ykbvUSGE8UFJepAg .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ykbvUSGE8UFJepAg .cluster text{fill:#333;}#mermaid-svg-ykbvUSGE8UFJepAg .cluster span{color:#333;}#mermaid-svg-ykbvUSGE8UFJepAg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ykbvUSGE8UFJepAg .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ykbvUSGE8UFJepAg rect.text{fill:none;stroke-width:0;}#mermaid-svg-ykbvUSGE8UFJepAg .icon-shape,#mermaid-svg-ykbvUSGE8UFJepAg .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ykbvUSGE8UFJepAg .icon-shape p,#mermaid-svg-ykbvUSGE8UFJepAg .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ykbvUSGE8UFJepAg .icon-shape rect,#mermaid-svg-ykbvUSGE8UFJepAg .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ykbvUSGE8UFJepAg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ykbvUSGE8UFJepAg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ykbvUSGE8UFJepAg :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
数据分层
ETL过程
外部表
外部表
外部表
ODS: 操作数据层
DWD: 明细数据层
DWS: 汇总数据层
ADS: 应用数据层
临时内部表
临时内部表
临时内部表
6.2 生产环境配置示例
— 1. 原始数据层 (ODS) – 外部表
CREATE EXTERNAL TABLE ods_user_behavior (
user_id STRING,
behavior STRING,
item_id STRING,
category_id STRING,
behavior_time STRING
)
PARTITIONED BY (dt STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\\t'
LOCATION '/data/ods/user_behavior/';
— 2. ETL临时表 – 内部表
CREATE TABLE tmp_user_behavior_clean
STORED AS ORC
AS
SELECT
user_id,
behavior,
item_id,
category_id,
FROM_UNIXTIME(CAST(behavior_time AS BIGINT)) AS behavior_time
FROM ods_user_behavior
WHERE dt = '${dt}';
— 3. 明细数据层 (DWD) – 外部表(方便其他任务使用)
CREATE EXTERNAL TABLE dwd_user_behavior
STORED AS PARQUET
LOCATION '/data/dwd/user_behavior/'
AS SELECT * FROM tmp_user_behavior_clean;
— 4. 清理临时表
DROP TABLE tmp_user_behavior_clean;
— 5. 汇总数据层 (DWS) – 外部表
CREATE EXTERNAL TABLE dws_user_daily_stats
PARTITIONED BY (dt STRING)
STORED AS PARQUET
LOCATION '/data/dws/user_daily/'
AS
SELECT
user_id,
dt,
COUNT(*) AS total_actions,
SUM(CASE WHEN behavior='pv' THEN 1 ELSE 0 END) AS pv_count,
SUM(CASE WHEN behavior='buy' THEN 1 ELSE 0 END) AS buy_count
FROM dwd_user_behavior
GROUP BY user_id, dt;
七、面试高频问题
Q1:什么时候用内部表,什么时候用外部表?
答:基于数据所有权和生命周期判断
- 外部表:数据由外部系统产生,需要被多个系统共享,或者需要长期保留
- 内部表:Hive自己产生的中间结果,生命周期与ETL任务绑定,用完可清理
Q2:外部表的数据被误删了怎么办?
答:外部表只删元数据,数据本身不会因为DROP TABLE而删除。但如果外部系统或手动删除了数据文件:
- 表还在,但查询会报错(文件不存在)
- 恢复方法:从备份恢复数据文件到原路径
- 预防:设置合理的权限和回收站机制
Q3:如何将内部表转为外部表?反之呢?
— 内部表转外部表
ALTER TABLE inner_table SET TBLPROPERTIES('EXTERNAL'='TRUE');
— 外部表转内部表
ALTER TABLE external_table SET TBLPROPERTIES('EXTERNAL'='FALSE');
— 注意:转换时数据不会移动,但删除行为会改变!
Q4:LOAD DATA到外部表会发生什么?
— 尝试向外部表LOAD数据
LOAD DATA INPATH '/tmp/data.txt' INTO TABLE external_table;
结果:会报错!外部表不支持LOAD DATA,因为:
- 外部表的数据应该由外部系统管理
- 要添加数据,直接HDFS操作(hdfs dfs -put)到表目录即可
Q5:分区表和外部表可以一起用吗?
答:当然可以!这是非常常见的组合。
CREATE EXTERNAL TABLE partitioned_logs (
ip STRING,
url STRING
)
PARTITIONED BY (dt STRING, hour STRING) — 分区字段
LOCATION '/data/logs/';
— 添加分区(必须手动添加,不会自动发现)
ALTER TABLE partitioned_logs ADD PARTITION (dt='2024-01-15', hour='10')
LOCATION '/data/logs/2024-01-15/10/';
八、总结
8.1 核心区别速记表
| 创建关键字 | CREATE TABLE | CREATE EXTERNAL TABLE |
| 数据位置 | Hive仓库目录 | 任意HDFS路径 |
| LOAD DATA | 移动数据 | 不支持 |
| DROP TABLE | 删除元数据+数据 | 只删元数据 |
| 数据所有权 | Hive拥有 | 外部系统拥有 |
| 适用场景 | 中间表、结果表 | 原始数据、共享数据 |
8.2 生产实践黄金法则
#mermaid-svg-dM9IlnDIQsM7ddwB{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-dM9IlnDIQsM7ddwB .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-dM9IlnDIQsM7ddwB .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-dM9IlnDIQsM7ddwB .error-icon{fill:#552222;}#mermaid-svg-dM9IlnDIQsM7ddwB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-dM9IlnDIQsM7ddwB .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-dM9IlnDIQsM7ddwB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-dM9IlnDIQsM7ddwB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-dM9IlnDIQsM7ddwB .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-dM9IlnDIQsM7ddwB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-dM9IlnDIQsM7ddwB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-dM9IlnDIQsM7ddwB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-dM9IlnDIQsM7ddwB .marker.cross{stroke:#333333;}#mermaid-svg-dM9IlnDIQsM7ddwB svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-dM9IlnDIQsM7ddwB p{margin:0;}#mermaid-svg-dM9IlnDIQsM7ddwB .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-dM9IlnDIQsM7ddwB .cluster-label text{fill:#333;}#mermaid-svg-dM9IlnDIQsM7ddwB .cluster-label span{color:#333;}#mermaid-svg-dM9IlnDIQsM7ddwB .cluster-label span p{background-color:transparent;}#mermaid-svg-dM9IlnDIQsM7ddwB .label text,#mermaid-svg-dM9IlnDIQsM7ddwB span{fill:#333;color:#333;}#mermaid-svg-dM9IlnDIQsM7ddwB .node rect,#mermaid-svg-dM9IlnDIQsM7ddwB .node circle,#mermaid-svg-dM9IlnDIQsM7ddwB .node ellipse,#mermaid-svg-dM9IlnDIQsM7ddwB .node polygon,#mermaid-svg-dM9IlnDIQsM7ddwB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-dM9IlnDIQsM7ddwB .rough-node .label text,#mermaid-svg-dM9IlnDIQsM7ddwB .node .label text,#mermaid-svg-dM9IlnDIQsM7ddwB .image-shape .label,#mermaid-svg-dM9IlnDIQsM7ddwB .icon-shape .label{text-anchor:middle;}#mermaid-svg-dM9IlnDIQsM7ddwB .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-dM9IlnDIQsM7ddwB .rough-node .label,#mermaid-svg-dM9IlnDIQsM7ddwB .node .label,#mermaid-svg-dM9IlnDIQsM7ddwB .image-shape .label,#mermaid-svg-dM9IlnDIQsM7ddwB .icon-shape .label{text-align:center;}#mermaid-svg-dM9IlnDIQsM7ddwB .node.clickable{cursor:pointer;}#mermaid-svg-dM9IlnDIQsM7ddwB .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-dM9IlnDIQsM7ddwB .arrowheadPath{fill:#333333;}#mermaid-svg-dM9IlnDIQsM7ddwB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-dM9IlnDIQsM7ddwB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-dM9IlnDIQsM7ddwB .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-dM9IlnDIQsM7ddwB .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-dM9IlnDIQsM7ddwB .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-dM9IlnDIQsM7ddwB .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-dM9IlnDIQsM7ddwB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-dM9IlnDIQsM7ddwB .cluster text{fill:#333;}#mermaid-svg-dM9IlnDIQsM7ddwB .cluster span{color:#333;}#mermaid-svg-dM9IlnDIQsM7ddwB div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-dM9IlnDIQsM7ddwB .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-dM9IlnDIQsM7ddwB rect.text{fill:none;stroke-width:0;}#mermaid-svg-dM9IlnDIQsM7ddwB .icon-shape,#mermaid-svg-dM9IlnDIQsM7ddwB .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-dM9IlnDIQsM7ddwB .icon-shape p,#mermaid-svg-dM9IlnDIQsM7ddwB .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-dM9IlnDIQsM7ddwB .icon-shape rect,#mermaid-svg-dM9IlnDIQsM7ddwB .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-dM9IlnDIQsM7ddwB .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-dM9IlnDIQsM7ddwB .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-dM9IlnDIQsM7ddwB :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
黄金法则
原始数据用外部表保护数据安全
中间表用内部表自动清理
共享数据用外部表方便多系统访问
结果数据看情况如需长期保留用外部表
生产实践
一句话总结:
外部表保护数据,内部表方便管理;原始数据用外部,中间结果用内部。
理解这个核心区别,你就能在Hive数据建模中做出正确的选择,既保证数据安全,又提高开发效率!
思考题:在CDH/HDP等企业级发行版中,如何通过Ranger/Sentry实现对内部表和外部表的权限控制?两者的权限模型有什么不同?欢迎在评论区讨论!

|
🌺The End🌺点点关注,收藏不迷路🌺 |




