Hive - 内表和外表的区别

本文详细介绍了Hive中的内部表与外部表的区别,包括数据存放位置、导入数据方式、删除表后的数据处理等核心内容。重点阐述了内部表与外部表在数据管理上的差异,帮助开发者更好地理解和运用Hive表类型。
1. 内部表
create table zz (name string , age string) location '/input/table_data';  
注:hive默认创建的是内部表
此时,会在hdfs上新建一个zz表的数据存放地

load data inpath '/input/data' into table zz;  
会将hdfs上的/input/data目录下的数据转移到/input/table_data目录下。 删除zz表后,会将zz表的数据和元数据信息全部删除,即最后/input/table_data下无数据,当然/input/data下再上一步已经没有了数据!

     如果创建内部表时没有指定location,就会在/user/hive/warehouse/下新建一个表目录,其余情况同上。

    注:load data会转移数据


2. 外部表
create external table et (name string , age string);  
会在/user/hive/warehouse/新建一个表目录et

load data inpath '/input/edata' into table et;  
把hdfs上/input/edata/下的数据转到/user/hive/warehouse/et下 ,删除这个外部表后,/user/hive/warehouse/et下的数据不会删除,但是/input/edata/下的数据在上一步load后已经没有了! 数据的位置发生了变化!本质是load一个hdfs上的数据时会转移数据!

3. 小结
最后归纳一下Hive中表与外部表的区别:
     1、在导入数据到外部表,数据并没有移动到自己的数据仓库目录下(如果指定了location的话),也就是说外部表中的数据并不是由它自己来管理的!而内部表则不一样;
     2、在删除内部表的时候,Hive将会把属于表的元数据和数据全部删掉;而删除外部表的时候,Hive仅仅删除外部表的元数据,数据是不会删除的!

     3. 在创建内部表或外部表时加上location 的效果是一样的,只不过表目录的位置不同而已,加上partition用法也一样,只不过表目录下会有分区目录而已,load data local inpath直接把本地文件系统的数据上传到hdfs上,有location上传到location指定的位置上,没有的话上传到hive默认配置的数据仓库中。

<think> 我们被要求回答Hive内部外部区别、特点及使用场景。根据提供的引用内容,我们可以总结如下: ### 内部外部区别 1. **创建方式**: - 内部(管理):默认创建,不需要特殊关键字。 - 外部:创建时必须使用`EXTERNAL`关键字,并且通常需要指定数据存储位置(`LOCATION`)。 2. **数据管理**: - 内部:数据由Hive自身管理。当删除内部时,Hive会删除的元数据(metadata)以及存储的数据(存储在HDFS上的数据)。 - 外部:数据由HDFS管理。当删除外部时,只删除的元数据,而HDFS上的数据文件仍然保留。 3. **数据存储位置**: - 内部:默认存储在Hive的配置目录(`hive.metastore.warehouse.dir`)下,例如:`/user/hive/warehouse/databasename.db/tablename/`。 - 外部:通常需要指定存储路径(`LOCATION`),可以指向HDFS上的任意位置。 4. **数据加载**: - 使用`LOAD DATA`命令加载数据时,对于内部Hive会将数据文件移动到自己的数据仓库目录中;对于外部Hive不会移动数据,而是直接使用指定位置的数据。 ### 特点 - **内部**: - 适合数据完全由Hive管理的场景。 - 生命周期与一致,删除则数据丢失。 - 适合中间、临时等不需要长期保留的数据。 - **外部**: - 数据独立于Hive,其他程序(如MapReduce、Spark)也可以直接使用这些数据。 - 删除不会影响数据文件,因此更安全,便于数据共享恢复。 - 适合存储原始数据(如日志数据)或需要多个框架共享的数据。 ### 使用场景 - **内部适用场景**: 1. 数据完全由Hive管理,不需要共享。 2. 生命周期短,临时使用的中间或结果(例如ETL过程中的中间)。 3. 需要Hive完全控制数据的场景,比如统计分析的结果,并且这些结果不需要长期保留。 - **外部适用场景**: 1. 数据需要被多个工具共享(如Hive、Spark、Impala等)。 2. 数据需要长期保留,即使被删除,数据也不能丢失(如原始日志数据)。 3. 数据由外部程序生成并维护,Hive只用于查询分析。 引用中提到的其他要点: - 在ETL处理中,内部常作为中间,因为清理时会同时删除数据,避免残留。 - 对于每天采集的日志(如ng日志埋点日志),建议使用外部,因为误删恢复困难,且方便共享。 - 业务数据可以使用外部或内部,因为恢复相对容易,但若需要紧凑管理元数据数据,则使用内部- 统计分析中的中间结果,如果不需要共享且需要自动清理,则使用内部。 ### 总结 根据引用内容,我们可以总结如下: > 内部外部的主要区别在于数据的管理方式(Hive管理 vs HDFS管理)删除操作的影响(是否删除数据文件)。内部适合临时数据,外部适合共享长期保留的数据[^1][^2][^3][^4]。 ### 附录:创建语法示例 1. 创建内部: ```sql CREATE TABLE internal_table ( id INT, name STRING ); ``` 2. 创建外部: ```sql CREATE EXTERNAL TABLE external_table ( id INT, name STRING ) LOCATION '/user/data/external_table'; ``` §§相关问题§§ 1. Hive中如何将内部转换为外部? 2. 在Hive中,如何查看一个是内部还是外部? 3. Hive外部的数据损坏了怎么办? 4. Hive内部与外部在性能上是否有差异? </think> ### Hive内部与外部区别、特点及使用场景 #### 一、核心区别 1. **数据管理权** - **内部**:数据完全由Hive管理,存储在Hive仓库目录(默认`/user/hive/warehouse`) *删除时,元数据HDFS数据文件均被删除* [^1][^4] - **外部**:数据由HDFS管理,仅通过元数据关联 *删除时,仅删除元数据,HDFS数据文件保留* [^2][^3] 2. **创建语法** ```sql -- 内部(默认) CREATE TABLE internal_table (...); -- 外部(需EXTERNAL关键字LOCATION) CREATE EXTERNAL TABLE external_table (...) LOCATION '/hdfs/path'; ``` 3. **数据生命周期** - 内部:数据与共存亡 - 外部:数据独立于存在 #### 二、特点对比 | **特性** | **内部** | **外部** | |----------------|-------------------------------|-------------------------------| | 存储位置 | Hive仓库目录 | 自定义HDFS路径 | | LOAD DATA操作 | 移动数据到仓库目录 | 直接使用源数据(不移动) | | DROP TABLE | 删除元数据+数据文件 | 仅删除元数据 | | 数据共享 | 仅Hive访问 | 多引擎共享(Spark/MapReduce)| | 误删恢复 | 不可恢复 | 重建即可恢复 | #### 三、使用场景 ✅ **优先使用外部**: 1. 原始日志/埋点数据(防止误删且需长期保留)[^3] 2. 多系统共享数据(如Hive+Spark共用HDFS数据) 3. 外部程序维护的数据(Hive只读访问) ✅ **优先使用内部**: 1. ETL中间(临时数据,自动清理)[^3] 2. 统计结果(生命周期短,无需共享) 3. 需要Hive全权管理的数据集 > **典型实践**: > - 全量业务数据 → **内部**(紧凑管理) > - 增量日志数据 → **外部**(防误删且频繁更新)[^3] > - 跨平台共享数据 → **外部**(避免数据拷贝) #### 四、操作示例 1. **创建外部(指定HDFS路径)** ```sql CREATE EXTERNAL TABLE logs ( user_id STRING, event_time TIMESTAMP ) LOCATION '/data/raw/logs'; ``` 2. **内部转外部** ```sql ALTER TABLE internal_table SET TBLPROPERTIES ('EXTERNAL'='TRUE'); ``` ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值