配置单元内部表和外部表之间的区别?

ctehm74n  于 2021-06-04  发布在  Hadoop
关注(0)|答案(15)|浏览(427)

有人能告诉我Hive的外部表和内部表的区别吗。我知道丢table的时候会有区别。我不明白你说的数据是什么意思,元数据在内部表中被删除,而在外部表中只删除元数据。谁能给我解释一下节点的情况吗。

plupiseo

plupiseo1#

当hdfs中已有数据时,可以创建一个外部配置单元表来描述数据。之所以称为外部表,是因为外部表中的数据是在位置属性中指定的,而不是在默认仓库目录中指定的。
当在内部表中保存数据时,hive完全管理表和数据的生命周期。这意味着一旦删除内部表,数据就会被删除。如果删除外部表,则删除表元数据,但保留数据。大多数情况下,最好使用外部表,以避免错误地删除数据和表。

d6kp6zgx

d6kp6zgx2#

内部:首先创建表,然后加载数据
外部:存在数据并在其上创建表。

zphenhs4

zphenhs43#

配置单元中的外部表的最佳使用情形是,当您希望从csv或文本文件创建表时

1tuwyuhd

1tuwyuhd4#

根据我目前有限的研究和测试(使用hive1.1.0-cdh5.12.0),行为(而不是预期用途)的唯一区别似乎是当一个表被删除时
从hdfs文件系统中删除内部(托管)表的数据
而外部表的数据不会从hdfs文件系统中删除。
(注:请参阅中的“托管表和外部表”一节。)https://cwiki.apache.org/confluence/display/hive/languagemanual+ddl 其中列出了一些我不完全理解的其他差异)
我相信hive会根据从上到下的顺序选择创建表所需的位置
表创建期间定义的位置
在创建表的数据库/架构创建中定义的位置。
默认配置单元仓库目录(hive.site.xml中的属性hive.metastore.warehouse.dir)
如果在“创建配置单元表”期间未使用“位置”选项,则使用上述优先规则。这适用于内部和外部表。这意味着内部表不必驻留在仓库目录中,也可以驻留在其他任何地方。
注意:我可能错过了一些场景,但是基于我有限的探索,除了上面描述的一个区别(数据删除)之外,内部表和扩展表的行为似乎是相同的。我为内部和外部表尝试了以下场景。
创建带和不带位置选项的表
创建带和不带分区选项的表
使用配置单元load和insert语句添加新数据
将数据文件添加到配置单元外部的表位置(使用hdfs命令)并使用“msck repair table”命令刷新表
放下table

yvfmudvl

yvfmudvl5#

考虑以下最适合外部表的场景:
mapreduce(mr)作业过滤出一个巨大的日志文件 n 子日志文件(例如,每个子日志文件包含一个特定的消息类型日志)和输出,即 n 子日志文件存储在hdfs中。
这些日志文件将被加载到配置单元表中以执行进一步的分析,在这种情况下,我建议使用外部表,因为实际的日志文件是由外部进程(即mr作业)生成和拥有的,此外,您还可以避免将每个生成的日志文件加载到相应的配置单元表中的额外步骤。

yruzcnhs

yruzcnhs6#

对于托管表,配置单元控制其数据的生命周期。默认情况下,配置单元将托管表的数据存储在hive.metastore.warehouse.dir定义的目录下的子目录中。
删除托管表时,配置单元会删除表中的数据。但是托管表不太方便与其他工具共享。例如,假设我们有crea数据

ecfdbz9o

ecfdbz9o7#

外部配置单元表的优点是,当我们删除表时,它不会删除文件,我们可以用不同的设置设置行格式,如serde….分隔

3xiyfsfu

3xiyfsfu8#

内部表数据存储在仓库文件夹中,而外部表数据存储在表创建中提到的位置。
因此,当您删除一个内部表时,它会删除模式以及仓库文件夹下的数据,但对于一个外部表,您只会丢失模式。
因此,当您希望在删除外部表之后再次返回该表时,可以再次使用相同的模式创建一个表,并将其指向原始数据位置。希望现在清楚了。

svgewumm

svgewumm9#

配置单元表可以创建为外部或内部。这是一个影响数据加载、控制和管理方式的选择。
在下列情况下使用外部表:
数据也在Hive外使用。例如,数据文件由不锁定文件的现有程序读取和处理。
即使在删除表之后,数据也需要保留在基础位置。如果您将多个模式(表或视图)指向一个数据集,或者迭代各种可能的模式,则可以应用这种方法。
您希望使用自定义位置,如asv。
配置单元不应该拥有数据和控制设置、目录等,您有另一个程序或进程来做这些事情。
您没有基于现有表(如选择)创建表。
在下列情况下使用内部表:
数据是临时的。
您希望hive完全管理表和数据的生命周期。

vltsax25

vltsax2510#

回答您的问题:

对于外部表,配置单元将数据存储在创建表期间指定的位置(通常不在仓库目录中)。如果删除外部表,则删除表元数据,但不删除数据。
对于内部表,配置单元将数据存储到其仓库目录中。如果表被删除,那么表元数据和数据都将被删除。

供参考,

内外表的区别:
对于外部表-
外部表在hdfs服务器上存储文件,但表没有完全链接到源文件。
如果删除了外部表,则该文件仍保留在hdfs服务器上。
例如,如果您使用配置单元ql在配置单元中创建一个名为“table\u test”的外部表,并将该表链接到文件“file”,那么从配置单元中删除“table\u test”不会从hdfs中删除“file”。
任何有权访问hdfs文件结构的人都可以访问外部表文件,因此需要在hdfs文件/文件夹级别管理安全性。
元数据是在主节点上维护的,从配置单元中删除外部表只会删除元数据,而不会删除数据/文件。
对于内部表格-
根据中的设置存储在目录中 hive.metastore.warehouse.dir ,默认情况下,内部表存储在以下目录“/user/hive/warehouse”中,您可以通过更新配置文件中的位置来更改它。
删除表将分别从主节点和hdfs中删除元数据和数据。
内部表文件安全仅通过配置单元控制。安全性需要在配置单元内进行管理,可能是在模式级别(取决于组织)。
配置单元可能有内部或外部表,这是一个影响数据加载、控制和管理方式的选择。
在下列情况下使用外部表:
数据也在Hive外使用。例如,数据文件由不锁定文件的现有程序读取和处理。
即使在删除表之后,数据也需要保留在基础位置。如果将多个模式(表或视图)指向一个数据集,或者迭代各种可能的模式,则可以应用这种方法。
配置单元不应该拥有数据和控制设置、目录等,您可能有另一个程序或进程来执行这些操作。
您没有基于现有表(如选择)创建表。
在下列情况下使用内部表:
数据是临时的。
您希望hive完全管理表和数据的生命周期。
资料来源:
hdinsight:hive内部和外部表简介
hadoop-hive中的内部和外部表

83qze16e

83qze16e11#

hive在主节点上有一个关系数据库,用于跟踪状态。例如,当你 CREATE TABLE FOO(foo string) LOCATION 'hdfs://tmp/'; ,此表架构存储在数据库中。
如果您有一个分区表,则分区存储在数据库中(这允许配置单元使用分区列表,而无需转到文件系统并找到它们,等等)。这些都是“元数据”。
删除内部表时,它会删除数据,同时也会删除元数据。
删除外部表时,它只删除元数据。这意味着Hive现在对这些数据一无所知。它不触及数据本身。

b09cbbtk

b09cbbtk12#

在外部表中,如果删除它,它只删除表的模式,表数据存在于物理位置。因此要删除数据,请使用hadoop fs-rmr tablename。托管表配置单元将完全控制表。在外部表中,用户可以控制它。

r1wp621o

r1wp621o13#

还要记住,hive是一个大数据仓库。当您想删除一个表时,您不想丢失千兆字节或兆字节的数据。以这种规模生成、移动和复制数据非常耗时。当您删除“托管”表时,配置单元也会丢弃其数据。当您删除“外部”表时,只有配置单元元存储中的架构定义被删除。hdfs上的数据仍然存在。

ssm49v7z

ssm49v7z14#

如果希望配置单元管理数据的整个生命周期(包括删除),则内部表很有用,而当文件在配置单元外部使用时,外部表很有用。

2o7dmzc5

2o7dmzc515#

配置单元只将元数据存储在metastore中,原始数据存储在配置单元的外部。当我们使用外部表时,我们可以通过这些来指定位置“”。当我们删除表时,原始数据不会生效

相关问题