Поведение, которое вы видите, связано с тем, как Импала предназначена для работы. Impala выбирает метаданные таблицы, такие как структура таблицы, сведения о разделах, пути к файлам HDFS из HMS и сведения о блоке соответствующих путей к файлам HDFS из NameNode. Все эти детали извлекаются из Каталога и будут распределяться по демонам Impala для их выполнения.
Когда основные файлы таблицы удаляются и новые файлы записываются вне Impala, необходимо выполнить REFRE SH, чтобы новые данные файла (такие как файлы и сведения о соответствующем блоке) были выбраны и распределены по демонам. Таким образом, Impala узнает о недавно написанных файлах.
Поскольку вы перезаписываете файлы, запросы Impala не смогут найти файлы, о которых она знает, поскольку они уже удалены, а новые файлы записываются. Это ожидаемое событие.
В качестве решения вы можете выполнить одно из следующих действий:
- Добавить новые файлы в тот же путь HDFS таблицы вместо перезаписи. Таким образом, запросы Impala, запущенные для таблицы, все равно будут возвращать результаты. Однако результатом будут только более старые данные (поскольку Impala еще не знает о новых файлах), но, как вы сказали, ошибки можно избежать во время перезаписи. После создания новых файлов в каталогах таблицы вы можете выполнить операцию HDFS, чтобы удалить файлы, а затем выполнить инструкцию Impala REFRE SH для этой таблицы.
ИЛИ
Как вы сказали, вы можете записать новые файлы паркета в другой путь HDFS, и после завершения записи вы можете [
удалить старые файлы, переместить новые файлы в фактический путь HDFS таблицы с последующим REFRE SH]
ИЛИ [
Выполните инструкцию ALTER для таблицы, чтобы изменить расположение данных таблицы, указывающих на новый каталог ]. Если это ежедневный процесс, вам, возможно, придется реализовать его с помощью сценария, который запускается после успешного процесса записи, выполняемого Spark путем передачи каталогов (новых и старых каталогов) в качестве аргументов.
Надеюсь, это поможет!