Hive的创建外部表是否复制数据?

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

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

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

iCMS 回答:Hive的创建外部表是否复制数据?

配置单元CREATE TABLE不会复制任何数据。数据保留在表DDL中指定的位置。 CREATE TABLE仅在Hive Metastore中创建元数据。

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

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

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

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

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

蜂巢式交易是原子性的。如果使用HiveQL插入或重写数据,则它将数据写入临时位置,并且只有在命令成功执行后,文件才会移动到表位置(如果重写,旧文件将被删除)。如果SQL失败,数据将保持命令之前的状态。

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

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

另请参阅the difference between managed and external tables in Hive

本文链接:https://www.f2er.com/2246832.html

大家都在问