首页 文章

Hive内部表和外部表之间的区别?

提问于
浏览
84

任何人都可以告诉我Hive的外部表和内部表之间的区别 . 我知道放下 table 时会有所不同 . 我不明白你的意思是什么,数据和元数据在内部被删除,只有元数据被删除在外部表中 . 任何人都可以用节点来解释我 .

17 回答

  • 1

    Hive在主节点上有一个关系数据库,用于跟踪状态 . 例如,当您 CREATE TABLE FOO(foo string) LOCATION 'hdfs://tmp/'; 时,此表模式存储在数据库中 .

    如果您有分区表,则分区存储在数据库中(这允许配置单元使用分区列表而无需转到文件系统并查找它们等) . 这些东西就是“元数据” .

    删除内部表时,它会删除数据,并且还会删除元数据 .

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

  • -1

    Hive表可以创建为EXTERNAL或INTERNAL . 这是影响数据加载,控制和管理方式的选择 .

    在以下情况下使用EXTERNAL表:

    • 数据也在Hive之外使用 . 例如,数据文件由不锁定文件的现有程序读取和处理 .

    • 即使在DROP TABLE之后,数据也需要保留在基础位置 . 如果您将多个模式(表或视图)指向单个数据集,或者您正在迭代各种可能的模式,则可以应用此方法 .

    • 您想使用自定义位置,例如ASV .

    • Hive不应该拥有数据和控制设置,dirs等,你有另一个程序或进程来做这些事情 .

    • 您没有基于现有表创建表(AS SELECT) .

    在以下情况下使用INTERNAL表:

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

  • 33

    给你回答问题:

    对于外部表,Hive不会将数据移动到其仓库目录中 . 如果删除外部表,则删除表元数据,但不删除数据 .

    对于内部表,Hive将数据移动到其仓库目录中 . 如果删除该表,则将删除表元数据和数据 .


    供您参考,

    内部和外部表之间的区别:

    对于外部表 - 外部表将文件存储在HDFS服务器上,但表未完全链接到源文件 . 如果删除外部表,则该文件仍保留在HDFS服务器上 . 例如,如果您使用HIVE-QL在HIVE中创建一个名为“table_test”的外部表并将该表链接到文件“file”,则从HIVE中删除“table_test”将不会从HDFS中删除“file” . 任何有权访问HDFS文件结构的人都可以访问外部表文件,因此需要在HDFS文件/文件夹级别管理安全性 . 元数据在主节点上维护,从HIVE删除外部表只删除元数据而不删除数据/文件 . 对于内部表 - 根据hive.metastore.warehouse.dir中的设置存储在目录中,默认情况下,内部表存储在以下目录“/ user / hive / warehouse”中,您可以通过更新配置文件中的位置来更改它 . 删除表将分别从主节点和HDFS中删除元数据和数据 . 内部表文件安全性仅通过HIVE控制 . 需要在HIVE内部管理安全性,可能在模式级别(取决于组织) .


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

    Use EXTERNAL tables when:

    • data is also used outside of Hive . 例如,数据文件由不锁定文件的现有程序读取和处理 .

    • Data needs to remain in the underlying location even after a DROP TABLE. 如果您将多个模式(表或视图)指向单个数据集,或者您正在迭代各种可能的模式,则可以应用此选项 .

    • Hive should not own data and control settings, directories, etc . ,您可能有另一个程序或进程来执行这些操作 .

    • You are not creating table based on existing table (AS SELECT).

    Use INTERNAL tables when:

    • data is temporary .

    • 你想要 Hive to completely manage the life-cycle of the table and data .

    资源 :

    HDInsight: Hive Internal and External Tables Intro

    Internal & external tables in Hadoop- HIVE

  • 1

    内部表数据存储在Warehouse文件夹中,外部表数据指向您在表创建中提到的位置 . 因此,当您删除内部表时,它会删除Schema以及Warehouse文件夹下的Data,但在外部表中,它的唯一Schema将会松散 . 所以,当你想要 table 回来你可以再次创建一个带有模式的表并指向该位置 . 希望现在很清楚 .

  • 93

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

  • 2

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

    • 内部(托管)表的数据从HDFS文件系统中删除

    • ,而外部表的数据不会从HDFS文件系统中删除 .

    (注意:请参阅https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL中的第'Managed and External Tables'节,其中列出了一些我并不完全理解的差异)

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

    • 表创建期间定义的位置

    • 在创建表的数据库/模式创建中定义的位置 .

    • 默认Hive仓库目录(hive.site.xml中的属性hive.metastore.warehouse.dir)

    在“创建配置单元表”期间未使用“位置”选项时,将使用上述优先规则 . 这适用于内部和外部表 . 这意味着内部表不一定必须驻留在Warehouse目录中,并且可以驻留在其他任何位置 .

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

    • 使用和不使用Location选项创建表

    • 使用和不使用分区选项创建表

    • 使用Hive加载和插入语句添加新数据

    • 将数据文件添加到Hive外部的Table位置(使用HDFS命令)并使用“MSCK REPAIR TABLE”命令刷新表

    • 删除表格

  • 0

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

  • 1

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

  • 1

    另请记住,Hive是一个大数据仓库 . 如果你想删除一个表,你不想丢失千兆字节或太字节数据 . 以该比例生成,移动和复制数据可能是耗时的 . 当您删除“托管”表时,配置单元也会删除其数据 . 删除“外部”表时,仅删除来自hive元存储的模式定义 . hdfs上的数据仍然存在 .

  • 85

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

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

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

  • 0

    配置单元中外部表的最佳用例是,您希望从CSV或文本文件创建表

  • 4

    当我们使用外部表时,hive只存储元数据中的元数据和hive外部的原始数据我们可以通过这些我们的原始数据给出位置''当我们丢弃表时不会生效

  • 0

    当HDFS中已存在数据时,可以创建外部Hive表来描述数据 . 它被称为EXTERNAL,因为外部表中的数据是在LOCATION属性中指定的,而不是默认的仓库目录 .

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

  • -2

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

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

    那时,外部表被定义为指向该数据,但不取得它的所有权 .

  • 1

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

  • 0

    INTERNALTable 已创建 FirstData 已加载 later

    EXTERNALDatapresentTablecreated on top .

  • 2

    简单来说,有两件事:

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

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

    2)对于外部表,数据是从仓库永久管理的 . 因此无法删除,其他客户端也可以使用它 .

相关问题