任何人都可以告诉我Hive的外部表和内部表之间的区别。 我知道放下桌子时会有所不同。我不明白你的意思是什么,数据和元数据在内部被删除,只有元数据被删除在外部表中。 任何人都可以用节点来解释我。
答案 0 :(得分:104)
Hive在主节点上有一个关系数据库,用于跟踪状态。
例如,当您CREATE TABLE FOO(foo string) LOCATION 'hdfs://tmp/';
时,此表模式存储在数据库中。
如果您有分区表,则分区存储在数据库中(这允许配置单元使用分区列表而无需转到文件系统并查找它们等)。这些东西就是“元数据”。
当您删除内部表时,它会删除数据,并且还会丢弃元数据。
删除外部表时,它只会删除元数据。这意味着蜂巢现在对这些数据一无所知。它不会触及数据本身。
答案 1 :(得分:89)
Hive表可以创建为EXTERNAL或INTERNAL。这是影响数据加载,控制和管理方式的选择。
在以下情况下使用EXTERNAL表:
在以下情况下使用INTERNAL表:
数据是暂时的。
您希望Hive完全管理表和数据的生命周期。
答案 2 :(得分:37)
对于外部表,Hive不会将数据移动到其仓库目录中。如果删除外部表,则删除表元数据,但不删除数据。
对于内部表,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可能有内部或外部表,这是影响数据加载,控制和管理方式的选择。
在以下情况下使用EXTERNAL表:
在以下情况下使用INTERNAL表:
来源:
答案 3 :(得分:4)
内部表数据存储在Warehouse文件夹中,外部表数据指向您在表创建中提到的位置。因此,当您删除内部表时,它会删除Schema以及Warehouse文件夹下的Data,但在外部表中,它的唯一Schema将会松散。因此,当您想要返回表时,您可以再次使用模式创建表并指向该位置。希望现在很清楚。
答案 4 :(得分:3)
在外部表中,如果删除它,它只删除表的模式,表数据存在于物理位置。所以要删除数据使用hadoop fs - rmr tablename。 托管表配置单元将完全控制表。在外部表中,用户可以控制它。
答案 5 :(得分:2)
基于我迄今为止有限的研究和测试(使用Hive 1.1.0 -cdh5.12.0),行为(不是预期用途)的唯一区别似乎是当表被删除时
(注意:请参阅https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL中的“托管和外部表格”一节,其中列出了一些我并不完全理解的差异。
我相信Hive会根据以下优先顺序从上到下选择创建表所需的位置
在“创建配置单元表”期间未使用“位置”选项时,将使用上述优先规则。这适用于内部和外部表。这意味着内部表不一定必须驻留在Warehouse目录中,并且可以驻留在其他任何位置。
注意:我可能错过了一些场景,但基于我的有限探索,除了上面描述的一个差异(数据删除)之外,内部和外部表的行为似乎是相同的。我为内部和外部表尝试了以下方案。
答案 6 :(得分:1)
如果您希望Hive管理数据的整个生命周期(包括删除),则内部表非常有用,而在Hive之外使用文件时,外部表非常有用。
答案 7 :(得分:1)
外部hive表的优点是,当我们删除表时它不会删除文件,我们可以设置不同设置的行格式,如serde .... delimited
答案 8 :(得分:1)
考虑最适合外部表格的场景:
MapReduce(MR)作业过滤大型日志文件以吐出n
个子日志文件(例如,每个子日志文件包含特定的消息类型日志)和输出即n
个子日志文件存储在hdfs中。
这些日志文件将被加载到Hive表中以执行进一步的分析,在这种情况下,我建议使用外部表,因为实际的日志文件是由外部进程生成并拥有的,即除了您之外的MR作业可以避免将每个生成的日志文件加载到相应的Hive表中的附加步骤。
答案 9 :(得分:1)
另请注意,Hive是一个大数据仓库。如果你想删除一个表,你不想丢失千兆字节或太字节数据。以该比例生成,移动和复制数据可能是耗时的。 当您放弃管理' table hive也会丢弃其数据。 放弃'外部'表仅删除了来自hive元存储的模式定义。 hdfs上的数据仍然存在。
答案 10 :(得分:1)
配置单元中外部表的最佳用例是当您要从CSV或文本文件创建表时
答案 11 :(得分:0)
我想添加
答案 12 :(得分:0)
在Hive中我们还可以创建一个外部表。它告诉Hive引用仓库目录外的现有位置的数据。 删除外部表将删除元数据,但不删除数据。
答案 13 :(得分:0)
对于托管表,Hive控制其数据的生命周期。 Hive默认情况下将托管表的数据存储在hive.metastore.warehouse.dir定义的目录下的子目录中。
当我们删除托管表时,Hive会删除表中的数据。但是托管表不太方便与其他工具共享。例如,假设我们主要由Pig创建和使用的数据,但是我们想对它运行一些查询,但不给Hive所有权。
此时,外部表定义为指向该数据,但不取得所有权。
答案 14 :(得分:0)
hive只存储元数据中的元数据和hive外部的原始数据,当我们使用外部表时我们可以给出位置' '通过这些我们的原始数据不会影响当我们放弃表
答案 15 :(得分:-1)
内部:表已创建第一次且数据已加载以后 < / p>
EXTERNAL :数据 存在且表 在上创建它
答案 16 :(得分:-2)
简单来说,有两件事:
Hive可以管理仓库中的东西,即它不会从仓库中删除数据。 当我们删除表时:
1)对于内部表,数据在仓库内部进行管理。所以将被删除。
2)对于外部表,数据是从仓库永久管理的。因此无法删除,其他客户端也可以使用它。