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

Does Hive's Create External Table copy data?

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

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

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

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

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

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

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

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

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

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

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

另请参阅