我有一个由拼花文件支持的Impala表,由另一个团队使用。每天我运行一个批处理Spark作业,覆盖现有的拼花文件(创建新数据集,现有文件将被删除,新文件将被创建)
我们的火花代码看起来像这样
数据集。写。格式化(“拼花”)。模式(“覆盖”)。保存(路径)
在此更新期间(覆盖拼花数据文件,然后覆盖REFRESH
Impala表),如果有人访问该表,那么他们最终会错误地说底层数据文件不存在。
是否有任何解决方案或解决方法可用于此问题?因为我不希望其他团队在访问表时的任何时间点看到错误。
也许我可以将新数据文件写入不同的位置,然后使Impala表指向该位置?
您看到的行为是由于Impala的设计工作方式。Impala从HMS获取表的元数据,例如表结构、分区详细信息、HDFS文件路径以及来自NameNode的相应HDFS文件路径的块详细信息。所有这些详细信息都由Catalog获取,并将分布在Impala守护程序中执行。
当表的底层文件被移除并在Impala外部写入新文件时,需要执行REFRESH,以便新的文件详细信息(例如文件和相应的块详细信息)将被获取并分发到守护进程中。这样Impala就会意识到新写入的文件。
由于您正在覆盖文件,Impala查询将无法找到它知道的文件,因为它们已被删除并且正在写入新文件。这是预期的事件。
作为解决方案,您可以执行以下操作之一,
或
希望这有帮助!