蜂巢内部表和外部表之间的区别?

有人能告诉我 Hive 的外部表和内部表之间的区别吗。 我知道放下桌子的时候就不一样了。我不明白您所说的数据和元数据在内部被删除,只有元数据在外部表中被删除是什么意思。 谁能给我解释一下节点的概念。

211512 次浏览

蜂巢在主节点上有一个关系数据库用来跟踪状态。 例如,当您使用 CREATE TABLE FOO(foo string) LOCATION 'hdfs://tmp/';时,此表架构存储在数据库中。

如果您有一个分区表,那么分区存储在数据库中(这允许 hive 使用分区列表,而无需进入文件系统并查找它们,等等)。这些东西就是“元数据”。

当您删除一个内部表时,它会删除数据,同时也会删除元数据。

删除外部表时,它只删除元数据。这意味着蜂巢现在对这些数据一无所知。它不接触数据本身。

在外部表中,如果删除它,它只删除表的架构,表数据存在于物理位置。因此,要删除数据,请使用 hadoop fs-rmrtablename。 托管表集群将对表进行完全控制。在外部表中,用户将对其进行控制。

蜂巢表可以创建为 EXTERNAL 或 INTERNAL。这是一个影响数据加载、控制和管理方式的选择。

在下列情况下使用外部表:

  1. 数据也在 Hive 之外使用。例如,数据文件由不锁定文件的现有程序读取和处理。
  2. 即使在 DROPTABLE 之后,数据也需要保留在底层位置。如果将多个模式(表或视图)指向单个数据集,或者迭代各种可能的模式,则可以采用这种方法。
  3. 您希望使用诸如 ASV 之类的自定义位置。
  4. 蜂巢不应该拥有数据和控制设置,目录等,你有另一个程序或进程,将做这些事情。
  5. You are not creating table based on existing table (AS SELECT).

在下列情况下使用 INTERNAL 表:

这些数据是暂时的。

您希望 Hive 完全管理表和数据的生命周期。

如果希望 Hive 管理包括删除在内的数据的完整生命周期,那么内部表非常有用,而当文件在 Hive 之外使用时,外部表非常有用。

外部蜂巢表的优点是,它不删除文件时,我们删除表,我们可以设置不同的设置行格式,如 serde... 。分隔

Consider this scenario which best suits for External Table:

MapReduce (MR)作业过滤一个巨大的日志文件来生成 n子日志文件(例如,每个子日志文件包含一个特定的消息类型日志) ,输出即 n子日志文件存储在 hdfs 中。

这些日志文件将被加载到 Hive 表中以进行进一步的分析,在这种情况下,我建议使用外部表,因为实际的日志文件是由外部进程生成和拥有的,即除了 MR 作业之外,还可以避免将每个生成的日志文件加载到相应的 Hive 表中的额外步骤。

还要记住,Hive 是一个大型数据仓库。当您想删除一个表时,您不希望丢失千兆字节或兆字节的数据。在这种规模下生成、移动和复制数据可能非常耗时。 当你删除一个“托管”表蜂巢也将垃圾其数据。 当您删除一个“外部”表时,只有来自 hive 元存储的模式定义被删除。关于 hdfs 的数据仍然存在。

内部表数据存储在仓库文件夹中,而外部表数据存储在表创建中提到的位置。

因此,当您删除一个内部表时,它会删除模式以及仓库文件夹下的数据,但是对于一个外部表,只有模式会松散。

因此,当您需要在删除外部表之后再次返回该表时,可以再次创建具有相同架构的表,并将其指向原始数据位置。希望现在清楚了。

Hive 只在元存储中存储元数据,在 hive 外部存储原始数据,当我们使用外部表时,我们可以通过这些原始数据给出位置‘ ,当我们删除表时,这些原始数据不会起作用

当 HDFS 中已有数据时,可以创建一个外部 Hive 表来描述数据。之所以称为 EXTERNAL,是因为外部表中的数据是在 LOCATION 属性中指定的,而不是默认的仓库目录。

当将数据保存在内部表中时,Hive 完全管理表和数据的生命周期。这意味着一旦内部表被删除,数据就会被删除。如果删除外部表,则删除表元数据,但保留数据。大多数情况下,为了避免错误地将数据和表一起删除,最好使用外部表。

对于托管表,Hive 控制其数据的生命周期。Hive 将托管表的数据存储在一个子目录中,默认情况下,该目录位于 Hive.metore.warehouse.dir 定义的目录下。

删除托管表时,Hive 会删除表中的数据。但是与其他工具共享托管表就不那么方便了。例如,假设我们有主要由 Pigg 创建和使用的数据,但是我们希望对它运行一些查询,但是不给予 Hive 数据的所有权。

At that time, external table is defined that points to that data, but doesn’t take ownership of it.

回答你问题:

对于外部表,Hive 将数据存储在创建表期间指定的 LOCATION 中(通常不在仓库目录中)。如果删除外部表,则删除表元数据,但不删除数据。

对于内部表,Hive 将数据存储到其仓库目录中。如果删除了表,那么表元数据和数据都将被删除。


供你参考,

内部表与外部表的区别:

对于外部表-

  • 外部表在 HDFS 服务器上存储文件,但是表没有完全链接到源文件。

  • 如果删除外部表,文件仍然保留在 HDFS 服务器上。

    As an example if you create an 外部桌子 called “ table _ test” in HIVE using HIVE-QL and link the table to file “文件”, 然后从 HIVE 中删除“ table _ test”将不会从 HDFS 中删除“ file”.

  • 任何有 HDFS 文件结构权限的人都可以访问外部表文件,因此需要在 HDFS 中管理安全性 file/folder level.

  • 元数据在主节点上维护,从 HIVE 中删除外部表只会删除元数据,而不会删除数据/文件。


内部表格-

  • 根据 hive.metastore.warehouse.dir中的设置存储在一个目录中, 默认情况下,内部表存储在以下目录 < strong > “/user/hive/ware” ,您可以通过更新配置文件中的位置来更改它。
  • 删除表分别从 master-node 和 HDFS 中删除元数据和数据。
  • 内部表文件的安全性仅通过 HIVE 来控制。需要在 HIVE 中管理安全性,可能是在模式级别(取决于 组织)。

Hive 可能有内部或外部表,这是一个影响数据加载、控制和管理方式的选择。

在下列情况下使用外部表:

  • The 数据也在蜂巢之外使用. For example, the data files are read and processed by an existing program that doesn’t lock the files.
  • 即使在 DROPTABLE 之后,数据也需要保留在底层位置。 如果您在一个数据集上指向多个模式(表或视图) ,或者您正在迭代各种可能的模式,那么这可能适用。
  • Hive should not own data and control settings, directories, etc., you may have another program or process that will do those things.
  • 您不是基于现有表(ASSELECT)创建表。

Use INTERNAL tables when:

  • 数据是临时性的.
  • 你想要 Hive 完全管理表和数据的生命周期

来源:

Hive 内部和外部表介绍

Hadoop-HIVE 中的内部和外部表

简而言之,有两件事:

Hive 可以管理仓库中的东西,也就是说它不会从仓库中删除数据。 When we delete table:

1)对于内部表,数据在仓库内部进行管理,因此将被删除。

2)对于外部表,数据是从仓库永久管理的。所以不能删除和客户端其他蜂巢也可以使用它。

The best use case for an external table in the hive is when you want to create the table from a file either CSV or text

根据我目前为止有限的研究和测试(使用 Hive 1.1.0-cdh5.12.0) ,唯一的行为差异(不是预期的用法)似乎是当一个表被删除时

  • 从 HDFS 文件系统中删除 Internal (Managed)表的数据
  • 而外部表的数据不会从 HDFS 文件系统中删除。

(注意: 请参阅 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL中的“托管表和外部表”部分,其中列出了一些我不完全理解的其他差异)

我相信 Hive 根据以下从上到下的优先级选择它需要创建表的位置

  1. 在创建表时定义的位置
  2. 在创建表的 Database/Schema Create 中定义的位置。
  3. 默认的 Hive Warehouse Directory (Hive.site.xml 中的属性 Hive.metore.Warehouse.dir)

当“ Location”选项在“创建 hive 表”期间未使用时,将使用上述优先级规则。这适用于内部表和外部表。这意味着 Internal 表不一定必须驻留在 Warehouse 目录中,而且可以驻留在其他任何地方。

注意: 我可能错过了一些场景,但是基于我有限的探索,除了上面描述的一个差异(数据删除)之外,Internal 和 Extenal 表的行为似乎是相同的。对于内部表和外部表,我尝试了以下方案。

  1. 创建带有和不带有 Location 选项的表
  2. 创建有或没有分区选项的表
  3. 使用 Hive Load 和 Insert 语句添加新数据
  4. Adding data files to the Table location outside of Hive (using HDFS commands) and refreshing the table using the "MSCK REPAIR TABLE command
  5. 放下桌子

INTERNAL : 桌子 is created 首先 and 百科 is loaded later

外部 : 百科现在桌子创造出来的

In Hive We can also create an external table. It tells Hive to refer to the data that is at an existing location outside the warehouse directory. 删除“外部”表将删除元数据,但不删除数据。

我想补充一点

  1. 当需要更新数据或需要删除某些行时,将使用内部表,因为内部表可以支持 ACID 属性,但外部表不支持 ACID 属性。
  2. 请确保内部表中有数据的备份,因为如果删除内部表,数据也将丢失。

内部外部的表都属于 蜂巢。唯一的区别是数据的所有权。下面显示了创建这两个表的命令。在创建外部表的情况下,只有一个额外的 外部关键字。使用 SQL 语句,两个表都可以是 创建/删除/修改

对于 内部表格,表和表中包含的数据都由 HIVE管理。也就是说,我们可以使用 HIVE对任何数据进行 添加/删除/修改。当我们 放下的表,连同表,数据也会被删除。

例如: CREATE TABLE tweets (text STRING, words INT, length INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE;

对于 外部表格,只有表由 蜂巢管理。这些表中的数据可以来自任何存储位置,如 HDFS。我们不能 添加/删除/修改这些表中的数据。我们只能使用 选择语句使用这些表中的数据。当我们 放下表时,只有表被删除,而不是包含在其中的数据。这就是为什么它说只有 元数据被删除。当我们创建 外部表时,我们需要提到数据的位置。

例如: CREATE EXTERNAL TABLE tweets (text STRING, words INT, length INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE LOCATION '/user/hive/warehouse/tweets';