Hive的CreateExternalTable会复制数据吗?

Met*_*est 6 hadoop hive atomic external-tables avro

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

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

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

lef*_*oin 3

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

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

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

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

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

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

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

另请阅读有关 Hive ACID 模式的信息:Hive 事务

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