【问题标题】:Does Hive's Create External Table copy data?Hive 的 Create External Table 是否复制数据?
【发布时间】:2020-09-16 19:35:08
【问题描述】:

我有一个以 Avro 格式写入输出文件的 Spark 应用程序。现在我希望这些数据在 Hive 中可用,因为使用该数据的应用程序只能通过 Hive 表来实现。

据描述 here 可以通过在 Hive 中使用 CREATE EXTERNAL TABLE 来做到这一点。现在我的问题是,CREATE EXTERNAL TABLE 方法的效率如何。它会将所有 Avro 数据复制到 HDFS 上的其他位置以工作,还是只是创建一些 metainfo,它可以用来查询 Avro 数据?

另外,如果我想继续向该表添加新的 Avro 数据怎么办。我可以创建一次这样的外部表,然后继续向其中添加新的 Avro 数据吗?另外,如果有人在更新数据时查询数据怎么办。是否允许原子事务?

【问题讨论】:

    标签: hadoop hive avro atomic external-tables


    【解决方案1】:

    Hive CREATE TABLE 语句不复制任​​何数据。数据保留在表 DDL 中指定的位置。 CREATE TABLE 仅在 Hive 元存储中创建元数据。

    您可以稍后在同一位置添加文件。

    HDFS 不允许更新。您可以删除文件并放置新文件。 select 将在删除和放置新文件之间返回空数据集。

    另外,当您直接操作文件时,Hive 统计信息不会刷新,因为 Hive 不知道您已更改数据。

    Hive 不知道您是否更改了文件,因为文件系统和 Hive 连接松散。 Hive 具有包含表架构定义、serde 和位置、统计信息等的元数据。在您更改表位置中的数据后,它保持不变。

    Hive 事务是原子的。如果您使用 HiveQL 插入或重写数据,它会将数据写入临时位置,并且仅当命令成功时才会将文件移动到表位置(在重写时删除旧文件)。如果 SQL 失败,数据将保持在命令之前的状态。

    但是由于 Hive 不会将数据从 table 位置复制到某些内部托管存储中,如果您在 Hive 读取文件时对其进行操作,那么它将在 hive 进程中出现异常。 Hive 在您的文件操作期间无法锁定表,因为 Hive 不知道它。文件系统与 Hive 完全分离,您可以在文件系统中做任何事情,就好像根本不存在 Hive 一样。

    另请阅读 Hive ACID 模式:Hive Transactions

    还可以阅读the difference between managed and external tables in Hive

    【讨论】:

      猜你喜欢
      • 2020-02-08
      • 2019-09-07
      • 2020-03-21
      • 2023-01-04
      • 1970-01-01
      • 1970-01-01
      • 2015-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多