配置单元是否创建外部表拷贝数据?

cld4siwp  于 2021-05-31  发布在  Hadoop
关注(0)|答案(1)|浏览(364)

我有一个spark应用程序,它以avro格式编写输出文件。现在,我希望这些数据可以在hive中使用,因为使用这些数据的应用程序只能通过hive表来实现。
这里描述的是可以通过使用 CREATE EXTERNAL TABLE 在Hive里。现在我的问题是,这个系统的效率有多高 CREATE EXTERNAL TABLE 方法。它是将所有avro数据复制到hdfs上的其他地方来工作,还是仅仅创建一些avro数据 metainfo ,它可以用来查询avro数据?
另外,如果我想继续向表中添加新的avro数据呢。我可以创建一次这样的外部表,然后继续向其中添加新的avro数据吗?如果有人在更新数据时查询数据又会怎样呢。它允许原子事务吗?

mrphzbgm

mrphzbgm1#

Hive CREATE TABLE 语句不复制任何数据。数据保留在表ddl中指定的位置。create table只在配置单元元存储中创建元数据。
以后可以在同一位置添加文件。
hdfs不允许更新。您可以删除文件并放置新文件。select将在删除和放置新文件之间返回空数据集。
如果是s3文件系统,并且您正在重写或删除相同的文件,那么最终可能会出现一致性问题(找不到文件等)。
另外,当您直接操作文件时,配置单元统计信息不会刷新,因为配置单元不知道您已经更改了数据。
配置单元不知道您是否更改了文件,因为文件系统和配置单元是松散连接的。配置单元有一个元数据,其中包含表架构定义、serde和位置、统计信息等,并且在更改表位置中的数据后,元数据保持不变。
配置单元事务是原子事务。如果使用hiveql插入或重写数据,它会将数据写入临时位置,并且仅当命令成功时,才会将文件移动到表位置(重写时会删除旧文件)。如果sql失败,数据将保持在命令之前的状态。
但是,由于配置单元不会将数据从表位置复制到某些内部托管存储中,如果您在配置单元读取文件时操作这些文件,那么在配置单元进程中这将是一个异常。配置单元无法在文件操作期间锁定表,因为配置单元不知道它。文件系统与配置单元完全分离,您可以在文件系统中做任何事情,就好像根本不存在配置单元一样。
另请阅读关于配置单元acid模式:配置单元事务
另外,请阅读有关配置单元中托管表和外部表之间的区别。

相关问题