您的位置:

Hive内部表与外部表的区别

一、内部表与外部表的概念

在Hive中,内部表和外部表是两个常见的概念。内部表是指Hive创建的具有管理表和数据的完全控制权的表,同时这些表也受到Hive生命周期管理。而外部表则是一种表,不受Hive管理表和数据的控制,这意味着外部表的数据可以由Hive之外的任何程序或实体(例如Hadoop MapReduce程序)创建和管理。

二、内部表与外部表的区别

内部表和外部表之间有以下主要区别:

1、表数据位置

内部表的数据存储在Hive默认的文件系统中,而外部表数据存储在指定的文件系统中,可以是HDFS或本地文件系统。

2、数据安全性

内部表的数据在删除表时会被自动删除,而外部表的数据在删除表时不会被自动删除。这意味着如果您需要保留数据,则必须手动备份数据,否则数据将永久丢失。

3、数据共享性

内部表的数据只能通过Hive进行管理和处理,而外部表的数据可以被多个应用程序共享和访问,甚至可以跨Hadoop集群共享。

4、数据可控性

内部表的数据可以完全由Hive进行控制,您可以使用ALTER TABLE语句更改表结构和基础数据,也可以使用Hive命令(如LOAD DATA或INSERT)添加或删除数据。但对于外部表,您只能使用Hive命令(如LOAD DATA或INSERT)添加或删除数据,而不能更改数据。使用ALTER TABLE语句修改表结构也不会更改外部表的数据。

三、如何创建内部表和外部表

1、创建内部表

  CREATE TABLE my_table (
    col1 INT,
    col2 STRING)
  STORED AS ORC;

该语句将在Hive默认文件系统中创建一个名为my_table的内部表,其中包含两列(col1和col2)以及一个ORC格式的存储。存储格式可以是其他Hive支持的存储格式,如PARQUET或AVRO,也可以是自定义格式。

2、创建外部表

  CREATE EXTERNAL TABLE my_external_table (
    col1 INT,
    col2 STRING)
  ROW FORMAT DELIMITED
  FIELDS TERMINATED BY ','
  LOCATION '/my/external/table';

该语句将在HDFS的/my/external/table路径下创建名为my_external_table的外部表。与内部表不同的是,外部表使用LOCATION关键字指定数据的存储位置。

四、内部表和外部表的应用场景

内部表适用于需要完全控制Hive管理数据和表结构的场景,例如,数据需要经常修改,而且不需要从其他系统或应用程序中读取或修改该数据。

外部表适用于数据被其他应用程序或实体管理的场景,例如,需要将现有的数据集集成到Hadoop生态系统中,或者需要在其他应用程序中生成数据并在Hadoop上进行处理和分析。

五、总结

在本文中,我们对Hive内部表与外部表进行了详细讨论,并介绍了它们各自的优点和限制。理解内部表和外部表的区别及其适用场景有助于您在Hive中选择正确的表类型,并且可以使您更好地控制和管理数据。