【发布时间】:2022-03-24 20:11:04
【问题描述】:
谁能告诉我 Hive 的外部表和内部表之间的区别。 我知道放下桌子时会有所不同。我不明白您的意思是数据和元数据在内部被删除,而只有元数据在外部表中被删除。 谁能帮我解释一下节点。
【问题讨论】:
谁能告诉我 Hive 的外部表和内部表之间的区别。 我知道放下桌子时会有所不同。我不明白您的意思是数据和元数据在内部被删除,而只有元数据在外部表中被删除。 谁能帮我解释一下节点。
【问题讨论】:
Hive 在用于跟踪状态的主节点上有一个关系数据库。
比如你CREATE TABLE FOO(foo string) LOCATION 'hdfs://tmp/';时,这个表的schema就存储在数据库里了。
如果您有一个分区表,则分区存储在数据库中(这允许 hive 使用分区列表而无需进入文件系统并找到它们等)。这些东西就是“元数据”。
当您删除内部表时,它会删除数据,也会删除元数据。
删除外部表时,它只会删除元数据。这意味着 hive 现在对这些数据一无所知。它不会触及数据本身。
【讨论】:
Hive 表可以创建为外部或内部。这是一个影响数据加载、控制和管理方式的选择。
在以下情况下使用外部表:
在以下情况下使用内部表:
数据是临时的。
您希望 Hive 完全管理表和数据的生命周期。
【讨论】:
对于外部表,Hive 将数据存储在创建表时指定的 LOCATION 中(一般不在仓库目录中)。如果删除外部表,则删除表元数据,但不会删除数据。
对于内部表,Hive 将数据存储到其仓库目录中。如果表被删除,那么表元数据和数据都将被删除。
内部和外部表之间的区别:
对于外部表 -
外部表将文件存储在 HDFS 服务器上,但表未完全链接到源文件。
如果您删除外部表,该文件仍保留在 HDFS 服务器上。
例如,如果您使用 HIVE-QL 在 HIVE 中创建一个名为 “table_test” 的外部表,并将该表链接到文件 “file”,那么从 HIVE 中删除“table_test”不会从 HDFS 中删除“文件”。
任何有权访问 HDFS 文件结构的人都可以访问外部表文件,因此需要在 HDFS 上管理安全性 文件/文件夹级别。
元数据保存在主节点上,从 HIVE 中删除外部表只会删除元数据,不会删除数据/文件。
对于内部表-
- 存储在基于
hive.metastore.warehouse.dir中设置的目录中, 默认情况下内部表存储在以下目录中“/user/hive/warehouse”您可以更改它通过更新配置文件中的位置。- 删除表会分别删除主节点和 HDFS 中的元数据和数据。
- 内部表格文件的安全性仅通过 HIVE 进行控制。需要在 HIVE 中管理安全性,可能在模式级别(取决于 关于组织)。
Hive 可能有内部或外部表,这是一个影响数据加载、控制和管理方式的选择。
在以下情况下使用外部表:
在以下情况下使用内部表:
来源:
【讨论】:
内部表数据存储在仓库文件夹中,而外部表数据存储在您在创建表时提到的位置。
因此,当您删除内部表时,它会删除架构以及仓库文件夹下的数据,但对于外部表,您只会丢失架构。
因此,当您希望在删除外部表后再次返回时,可以再次创建具有相同架构的表并将其指向原始数据位置。希望现在清楚了。
【讨论】:
根据我迄今为止有限的研究和测试(使用 Hive 1.1.0 -cdh5.12.0),行为(不是预期用途)的唯一区别似乎是删除表时
(注意:请参阅https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL 中的“托管表和外部表”部分,其中列出了我不完全理解的其他一些区别)
我相信Hive会根据以下从上到下的优先级选择它需要创建表的位置
在“创建hive表”过程中不使用“Location”选项时,使用上述优先规则。这适用于内部和外部表。这意味着内部表不一定必须驻留在 Warehouse 目录中,也可以驻留在其他任何位置。
注意:我可能错过了一些场景,但根据我有限的探索,内部表和外部表的行为似乎是相同的,除了上面描述的一个区别(数据删除)。我为内部和外部表尝试了以下方案。
【讨论】:
在外部表中,如果你删除它,它只会删除表的架构,表数据存在于物理位置。所以要删除数据使用 hadoop fs -rmr tablename 。 托管表配置单元将完全控制表。在外部表中,用户可以控制它。
【讨论】:
内部:表创建首先,数据加载稍后
EXTERNAL :数据存在,表格在之上创建它。
【讨论】:
如果您希望 Hive 管理数据的整个生命周期(包括删除),则内部表很有用,而当文件在 Hive 之外使用时,外部表很有用。
【讨论】:
External hive table 的优点是当我们删除表时它不会删除文件,我们可以使用不同的设置设置行格式,例如 serde....delimited
【讨论】:
另外请记住,Hive 是一个大数据仓库。当您想要删除一个表时,您不想丢失千兆字节或太字节的数据。以这种规模生成、移动和复制数据可能非常耗时。 当您删除“托管”表时,配置单元也会丢弃其数据。 当您删除“外部”表时,只会删除配置单元元存储中的模式定义。 hdfs上的数据仍然存在。
【讨论】:
考虑最适合外部表的场景:
MapReduce (MR) 作业过滤一个巨大的日志文件以吐出n 子日志文件(例如,每个子日志文件包含特定的消息类型日志)和输出即n 子日志文件存储在 hdfs .
这些日志文件将被加载到 Hive 表中以执行进一步分析,在这种情况下,我建议使用外部表,因为实际的日志文件是由外部进程生成和拥有的,即除了你之外的 MR 作业也可以避免将每个生成的日志文件加载到相应的 Hive 表中的额外步骤。
【讨论】:
hive 中外部表的最佳用例是当您想从 CSV 或文本文件创建表时
【讨论】:
Internal 和 External 表均归 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 表时,只有表被删除,其中包含的数据不会被删除。这就是为什么它说只有 meta-data 会被删除。当我们创建EXTERNAL表时,我们需要提及数据的位置。
例如:CREATE EXTERNAL TABLE tweets (text STRING, words INT, length INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE LOCATION '/user/hive/warehouse/tweets';
【讨论】:
hive 只存储 metastore 中的元数据和 hive 外部的原始数据,当我们使用外部表时,我们可以给出位置''通过这些我们的原始数据在我们删除表时不会影响
【讨论】:
当 HDFS 中已有数据时,可以创建一个外部 Hive 表来描述数据。之所以称为EXTERNAL,是因为外部表中的数据是在LOCATION 属性而不是默认仓库目录中指定的。
在内部表中保存数据时,Hive 完全管理表和数据的生命周期。这意味着一旦删除了内部表,数据就会被删除。如果删除了外部表,则表元数据将被删除,但数据会被保留。大多数情况下,首选外部表,以免误删数据和表。
【讨论】:
对于托管表,Hive 控制其数据的生命周期。 Hive 默认将托管表的数据存储在 hive.metastore.warehouse.dir 定义的目录下的子目录中。
当我们删除一个托管表时,Hive 会删除表中的数据。但是托管表不太方便与其他工具共享。例如,假设我们有主要由 Pig 创建和使用的数据,但我们想对它运行一些查询,但不给 Hive 数据的所有权。
那时,定义了指向该数据的外部表,但不拥有它的所有权。
【讨论】:
在 Hive 中我们也可以创建一个外部表。它告诉 Hive 引用位于仓库目录之外的现有位置的数据。 删除外部表将删除元数据,但不会删除数据。
【讨论】:
我想补充一下
【讨论】:
简单来说,有两件事:
Hive 可以管理仓库中的东西,即它不会删除仓库中的数据。 当我们删除表时:
1) 对于内部表,数据在仓库内部进行管理。所以会被删除。
2) 对于外部表,数据从仓库中永久管理。所以不能删除,hive以外的客户端也可以使用。
【讨论】: