繁体   English   中英

Hive 的 Create External Table 是否复制数据?

[英]Does Hive's Create External Table copy data?

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

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

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

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

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

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

如果它是 S3 文件系统并且您正在重写相同的文件或删除它们,则可能会发生最终的一致性问题(找不到文件等)。

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

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

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

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

另请阅读 Hive ACID 模式: Hive 事务

另请阅读Hive 中的托管表和外部表之间的区别

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM