我有一个由镶木地板文件支持的Impala表,该表由另一个团队使用。每天我运行一个批处理Spark作业,该作业将覆盖现有的镶木地板文件(创建新数据集,将删除现有文件并创建新文件)
我们的Spark代码看起来像这样
dataset.write.format("parquet").mode("overwrite").save(path)
在此更新过程中(覆盖镶木地板数据文件,然后覆盖REFRESH
Impala表),如果有人访问该表,那么他们将最终收到错误消息,说底层数据文件不存在。
是否有针对此问题的解决方案或解决方法?因为我不希望其他团队在访问表时随时看到错误。
也许我可以将新的数据文件写入其他位置,然后使Impala表指向该位置?
您看到的行为是由于Impala设计工作方式的原因。 Impala从HMS获取表的元数据,例如表结构,分区详细信息,HDFS文件路径,以及从NameNode获取相应的HDFS文件路径的块详细信息。所有这些详细信息都由Catalog获取,并将在Impala守护程序中分发以执行它们。
当删除表的基础文件并将新文件写入Impala之外时,必须执行REFRESH,以便新文件的详细信息(例如文件和相应的块详细信息)将被获取并分布在守护程序中。这样,Impala就会知道新写入的文件。
由于您正在覆盖文件,因此Impala查询将无法找到它所知道的文件,因为它们已经被删除并且正在写入新文件。这是预期的事件。
作为解决方案,您可以执行以下其中一项,
OR
希望这会有所帮助!