Hive内部表和外部表

一:内部表和外部表的区别

  • 创建表时使用关键字external创建的表就是外部表,没有使用该关键字创建的表就是内部表。
  • 删除表时(drop table)内部表会删除hdfs对应路径,而外部表不会删除hdfs对应的路径, 删除表无论是内部表和外部表都会删除元数据(metastore.TBLS、metastore.COLUMNS_V2)

二:location关键字

用于指定hdfs路径,如果不指定则使用默认的路径,默认路径规则为/<hive.metastore.warehouse.dir>/<数据库名称>.db/<表名>,location既可以用于内部表也可以用于外部表。

hive-site.xml

<property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/data/hive/warehouse</value>
</property>

<property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://localhost:3306/metastore?characterEncoding=UTF-8&amp;createDatabaseIfNotExist=true</value>
</property>

三:测试

1. 创建普通的内部表
create table tbl_line(line string) 
row format delimited 
fields terminated by '\n'
stored as textfile;
2. 使用location关键字创建内部表
create table tbl_line_loc(line string) 
row format delimited 
fields terminated by '\n'
stored as textfile
location "/line/loc";
3. 使用external关键字创建外部表
create external table tbl_line_ext(line string) 
row format delimited 
fields terminated by '\n'
stored as textfile;
4. 加载数据
echo "Hadoop Common\nHadoop Distributed File System\nHadoop YARN\nHadoop MapReduce " > /tmp/foobar.txt
hive> load data local inpath '/tmp/foobar.txt' into table tbl_line;
hive> load data local inpath '/tmp/foobar.txt' into table tbl_line_loc;
hive> load data local inpath '/tmp/foobar.txt' into table tbl_line_ext;
5. 查看hdfs路径
hadoop fs -ls -R /

在这里插入图片描述

6. 删除表
drop table tbl_line;
drop table tbl_line_loc;
drop table tbl_line_ext;
7. 再次查看hdfs路径
hadoop fs -ls -R /

内部表删除会删除hdfs对应的路径,外部表删除不会删除hdfs对应的路径。

在这里插入图片描述

<think>嗯,用户想了解Hive内部表外部表区别。我需要先回顾一下Hive的基本概念。内部表外部表在数据存储管理上有不同的行为。记得内部表的数据由Hive管理,删除会同删除数据,而外部表只管理元数据,删除不会影响数据文件。这可能用户提到的引用内容有关,特别是引用[2]提到的外部表在删除后文件仍然保留。 接下来需要整理两者的主要区别,比如存储位置、删除行为、用途场景等。用户提供的引用[1]提到HiveParquet在模式处理上的差异,但可能当前问题关联不大,不过引用[2]直接相关,应该引用。引用[3]关于TABLESAMPLE可能暂用不上,但先留着。 需要确保回答结构清晰,按照用户的要求分点说明。同,用户要求生成相关问题,所以得考虑常见疑问,比如使用场景、如何选择、数据恢复等。还要注意使用中文,LaTeX格式正确,但这个问题可能涉及较少数学公式,但如果有达式也要正确处理。 检查是否有遗漏点,比如创建语法的区别是否影响权限或其他Hive操作。可能还要提到EXTERNAL关键字使用,以及是否可以通过ALTER TABLE转换类型。另外,内部表适用于临数据,而外部表适合共享数据,比如与其他工具如Spark共用,避免误删数据。 最后,确保引用正确,引用[2]已经覆盖了外部表的关键点,其他引用可能不需要。总结强调用户根据数据生命周期管理需求来选择类型。</think>### Hive内部表外部表区别 Hive内部表(Internal Table)外部表(External Table)在数据存储、生命周期管理等方面有以下核心差异: --- #### 1. **数据存储位置与控制权** - **内部表**:数据文件默认存储在Hive的仓库目录(如`/user/hive/warehouse`),由Hive**全权管理**。创建语法无需指定`EXTERNAL`关键字。 - **外部表**:数据文件可存放在**任意HDFS路径**,由用户或外部系统管理。创建需显式声明`EXTERNAL`关键字: ```sql CREATE EXTERNAL TABLE table_name (...) LOCATION &#39;/path/to/data&#39;; ``` --- #### 2. **删除的行为** - **内部表**:执行`DROP TABLE`,**元数据(结构)底层数据文件会被同删除**。 - **外部表**:执行`DROP TABLE`,**仅删除元数据,数据文件保留**。这适用于与其他系统(如Spark)共享数据的场景[^2]。 --- #### 3. **应用场景** - **内部表**:适合临数据、中间或生命周期完全由Hive控制的场景。 - **外部表**:适合已存在的数据(如日志文件)、需要多引擎共享的数据,或要求数据持久化的场景[^2]。 --- #### 4. **数据恢复特性** - 若误删**内部表**,数据通常无法直接恢复(需依赖备份); - **外部表**的数据始终独立存在,重建后即可重新关联。 --- ### 选择建议 - 若需Hive**完全控制数据**,选内部表; - 若需**跨平台共享数据**或**避免误删风险**,选外部表。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风流 少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值