【问题标题】:Difference between Hive internal tables and external tables?Hive内部表和外部表的区别?
【发布时间】:2022-03-24 20:11:04
【问题描述】:

谁能告诉我 Hive 的外部表和内部表之间的区别。 我知道放下桌子时会有所不同。我不明白您的意思是数据和元数据在内部被删除,而只有元数据在外部表中被删除。 谁能帮我解释一下节点。

【问题讨论】:

    标签: hadoop hive hiveql


    【解决方案1】:

    Hive 在用于跟踪状态的主节点上有一个关系数据库。 比如你CREATE TABLE FOO(foo string) LOCATION 'hdfs://tmp/';时,这个表的schema就存储在数据库里了。

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

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

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

    【讨论】:

    • ok.. 例如我创建了一个外部表.. 我删除了它。怎么了?你说的数据没有被触及是什么意思?如果我选择该表的 * 它会显示吗?我无法想象其中的区别。
    • 如果你删除一个表,Hive 会返回它在你删除表之前的状态。如果您在删除 foo 后运行查询“select * from foo”,hive 会告诉您该表不存在。这是因为您已告诉 hive 忘记该表。数据仍然存在于它之前所在的任何文件系统中。将元数据视为指向数据所在位置的“指针”。
    • 所以你告诉我如果我在 dis 位置 opt/nancy/foo.txt 中有数据并且我将它加载到外部表中并删除它,元数据会丢失,但是这个位置中的数据 opt/ nancy/foo.txt 仍然存在?
    • 好的,现在这个位置是在 HDFS 还是我的本地系统中?如果它在本地系统中,当我将数据加载到内部表中并删除表时,文件 foo.txt 仍将保留在该位置。到目前为止我是对的吗?
    • Hive 表位于受支持的文件系统(Hbase、HDFS、S3 等)上。我假设您正在使用“加载数据”将本地文件中的数据加载到配置单元表中?在这种情况下,您将本地文件复制到配置单元表中。删除此表时,内部表中的数据副本将被删除,但“LOAD DATA”命令中的源文件仍然完好无损。
    【解决方案2】:

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

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

    1. 数据也在 Hive 之外使用。例如,数据文件由不锁定文件的现有程序读取和处理。
    2. 即使在 DROP TABLE 之后,数据也需要保留在底层位置。如果您将多个架构(表或视图)指向单个数据集,或者您正在迭代各种可能的架构,则此方法适用。
    3. 您想使用自定义位置,例如 ASV。
    4. Hive 不应该拥有数据和控制设置、目录等,你有另一个程序或进程可以做这些事情。
    5. 您不是基于现有表 (AS SELECT) 创建表。

    在以下情况下使用内部表:

    数据是临时的。

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

    【讨论】:

    • 会创建一个 INTERNAL 表从 HDFS 中删除数据,或者它会制作一个副本并专门用于配置单元,保持源(HDFS)完好无损?
    • @swetha 嗨,我来到这里是因为我完全删除了 metastore.db,但数据仍保留在 hdfs 上。所以当我显示表格时,什么都没有显示。有没有办法重新创建元数据?
    【解决方案3】:

    回答你的问题:

    对于外部表,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 之外使用。例如,数据文件由不锁定文件的现有程序读取和处理。
    • 即使在 DROP TABLE 之后,数据也需要保留在底层位置。如果您将多个架构(表或视图)指向单个数据集,或者您正在遍历各种可能的架构,则可能会出现这种情况。
    • Hive 不应拥有数据和控制设置、目录等。您可能有另一个程序或进程来执行这些操作。
    • 您不是基于现有表 (AS SELECT) 创建表。

    在以下情况下使用内部表:

    • 数据是临时的
    • 您希望 Hive 完全管理表和数据的生命周期

    来源:

    HDInsight: Hive Internal and External Tables Intro

    Internal & external tables in Hadoop- HIVE

    【讨论】:

    • @CapturedTree 但答案不正确。 “Hive 将数据移动到它的仓库目录中。”——这是完全错误的,事实并非如此。数据存储在表位置。不管是外部的还是托管的。
    【解决方案4】:

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

    因此,当您删除内部表时,它会删除架构以及仓库文件夹下的数据,但对于外部表,您只会丢失架构。

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

    【讨论】:

      【解决方案5】:

      根据我迄今为止有限的研究和测试(使用 Hive 1.1.0 -cdh5.12.0),行为(不是预期用途)的唯一区别似乎是删除表时

      • 内部(托管)表的数据从 HDFS 文件系统中删除
      • 虽然外部表的数据不会从 HDFS 文件系统中删除。

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

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

      1. 在表创建期间定义的位置
      2. 在创建表的数据库/模式创建中定义的位置。
      3. 默认 Hive 仓库目录(hive.site.xml 中的属性 hive.metastore.warehouse.dir)

      在“创建hive表”过程中不使用“Location”选项时,使用上述优先规则。这适用于内部和外部表。这意味着内部表不一定必须驻留在 Warehouse 目录中,也可以驻留在其他任何位置。

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

      1. 创建带有和不带有位置选项的表
      2. 使用和不使用分区选项创建表
      3. 使用 Hive 加载和插入语句添加新数据
      4. 将数据文件添加到 Hive 外部的表位置(使用 HDFS 命令)并使用“MSCK REPAIR TABLE 命令”刷新表
      5. 删除表格

      【讨论】:

      • 不错的探索。这是解释 hive 如何处理内部和外部表的位置选项的唯一答案。
      【解决方案6】:

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

      【讨论】:

      • 我遇到的情况是,在通过 CREATE TABLE foo (id INT) 创建的内部表上的 DROP TABLE 后,目录并不总是被删除。元数据显然没问题,因为 SHOW TABLES 是一致的 - 该表在删除后不会出现在该列表中。令人困惑的是,我注意到目录 /is/ 有时已删除,但我无法始终如一地重新创建它。有什么想法吗?
      • 是否检查了表的权限?您可能已将 HDFS 上位置的所有权更改为其他用户。
      【解决方案7】:

      内部创建首先数据加载稍后

      EXTERNAL数据存在表格之上创建它。

      【讨论】:

      • 不一定,你可以创建一个外部表,稍后在里面插入数据
      【解决方案8】:

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

      【讨论】:

        【解决方案9】:

        External hive table 的优点是当我们删除表时它不会删除文件,我们可以使用不同的设置设置行格式,例如 serde....delimited

        【讨论】:

          【解决方案10】:

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

          【讨论】:

            【解决方案11】:

            考虑最适合外部表的场景:

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

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

            【讨论】:

              【解决方案12】:

              hive 中外部表的最佳用例是当您想从 CSV 或文本文件创建表时

              【讨论】:

                【解决方案13】:

                InternalExternal 表均归 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';

                【讨论】:

                  【解决方案14】:

                  hive 只存储 metastore 中的元数据和 hive 外部的原始数据,当我们使用外部表时,我们可以给出位置''通过这些我们的原始数据在我们删除表时不会影响

                  【讨论】:

                    【解决方案15】:

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

                    在内部表中保存数据时,Hive 完全管理表和数据的生命周期。这意味着一旦删除了内部表,数据就会被删除。如果删除了外部表,则表元数据将被删除,但数据会被保留。大多数情况下,首选外部表,以免误删数据和表。

                    【讨论】:

                      【解决方案16】:

                      对于托管表,Hive 控制其数据的生命周期。 Hive 默认将托管表的数据存储在 hive.metastore.warehouse.dir 定义的目录下的子目录中。

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

                      那时,定义了指向该数据的外部表,但不拥有它的所有权。

                      【讨论】:

                        【解决方案17】:

                        在 Hive 中我们也可以创建一个外部表。它告诉 Hive 引用位于仓库目录之外的现有位置的数据。 删除外部表将删除元数据,但不会删除数据。

                        【讨论】:

                          【解决方案18】:

                          我想补充一下

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

                          【讨论】:

                            【解决方案19】:

                            简单来说,有两件事:

                            Hive 可以管理仓库中的东西,即它不会删除仓库中的数据。 当我们删除表时:

                            1) 对于内部表,数据在仓库内部进行管理。所以会被删除。

                            2) 对于外部表,数据从仓库中永久管理。所以不能删除,hive以外的客户端也可以使用。

                            【讨论】:

                              猜你喜欢
                              • 2023-03-19
                              • 2022-08-05
                              • 2019-10-12
                              • 1970-01-01
                              • 2013-07-26
                              • 1970-01-01
                              • 1970-01-01
                              • 2018-08-30
                              • 2018-12-08
                              相关资源
                              最近更新 更多