有谁可以告诉我Hive的外部表和内部表之间的区别。我知道这个区别在删除表时会体现出来。但是我不理解为什么在内部表中数据和元数据都被删除,而在外部表中只有元数据被删除。有人能用节点的术语来解释一下吗?
内部表和外部表都属于HIVE,唯一的区别在于数据所有权。下面展示了创建两种表的命令。只有在创建外部表时才会添加EXTERNAL关键词。两种表都可以使用SQL语句进行创建/删除/修改。
在内部表中,表和表中包含的数据都由HIVE管理。也就是说,我们可以使用HIVE来添加/删除/修改任何数据。当我们DROP表时,表和其中的数据也将被删除。
例如:CREATE TABLE tweets (text STRING, words INT, length INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE;
在外部表中,只有表由HIVE管理。这些表中的数据可以来自任何存储位置,如HDFS。我们不能添加/删除/修改这些表中的数据。我们只能使用SELECT语句来使用这些表中的数据。当我们DROP表时,只有表被删除,其中包含的数据不会被删除。这就是为什么说只有元数据被删除。当我们创建外部表时,需要指定数据的位置。
例如:CREATE EXTERNAL TABLE tweets (text STRING, words INT, length INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE LOCATION '/user/hive/warehouse/tweets';
内部表: 首先创建表格,然后稍后加载数据。
外部表: 数据已存在,在其上方创建表格。
当HDFS中已经有数据时,可以创建一个外部Hive表来描述数据。它被称为EXTERNAL,因为外部表中的数据是在LOCATION属性中指定而不是默认的仓库目录中。
当将数据保存在内部表中时,Hive完全管理表和数据的生命周期。这意味着一旦删除内部表,数据也会被删除。如果删除外部表,则表元数据会被删除,但数据会被保留。大多数情况下,为了避免错误地删除数据,外部表更受欢迎。
我想补充一下:
Hive 只在 metastore 中存储元数据,而将原始数据存储在 hive 外部。当我们使用外部表时,可以通过指定“location”来避免删除表时影响原始数据。
对于托管表,Hive 控制其数据的生命周期。Hive 默认将托管表的数据存储在 hive.metastore.warehouse.dir 定义的目录下的子目录中。
当我们删除托管表时,Hive 会删除表中的数据。但是托管表与其他工具共享不太方便。例如,假设我们有一些由 Pig 创建和使用的数据,但我们想针对这些数据运行一些查询,而不将数据的所有权交给 Hive。
此时,定义外部表指向该数据,但不拥有该数据。