我有一个Spark应用程序,它以Avro格式写入输出文件。现在,我希望该数据在Hive中可用,因为要利用这些数据的应用程序只能通过Hive表来使用。
[[0]令人遗憾的是,可以通过使用Hive中的CREATE EXTERNAL TABLE来做到这一点。现在我的问题是,CREATE EXTERNAL TABLE方法的效率如何。它将复制所有Avro数据到HDFS上的其他位置以工作,还是只是创建一些元信息以用于查询Avro数据?
此外,如果我想继续向该表添加新的Avro数据,该怎么办。我可以一次创建这样的外部表,然后继续向其中添加新的Avro数据吗?如果有人在更新数据时查询数据,该怎么办。它允许原子交易吗?
以后可以在同一位置添加文件。
HDFS不允许更新。您可以删除文件并放入新文件。 select将在删除和放置新文件之间的中间返回空数据集。
如果是S3文件系统,而您正在重写相同的文件或删除它们,则最终可能会发生一致性问题(找不到文件等)。>>
此外,当您直接操作文件时,由于Hive不知道您已更改数据,因此不会刷新Hive统计信息。
Hive不知道是否更改了文件,因为文件系统和Hive松散连接。 Hive具有元数据,其中包含表架构定义,序列号和位置,统计信息等。在更改表位置中的数据后,它保持不变。
蜂巢式交易是原子性的。如果使用HiveQL插入或重写数据,则它将数据写入临时位置,并且仅在命令成功后,文件才会移动到表位置(如果重写,旧文件将被删除)。如果SQL失败,数据将保持命令之前的状态。
但是,由于Hive不会像大多数RDBMS一样将数据从表位置复制到内部托管存储中,如果您在Hive读取文件时对其进行操作,那么在Hive进程中将是一个例外。
另请参阅有关Hive ACID模式:CREATE TABLE