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 数据吗?另外,如果有人在更新数据时查询数据怎么办?它允许原子事务吗?
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 中托管表和外部表之间的区别。
| 归档时间: |
|
| 查看次数: |
729 次 |
| 最近记录: |