Да, это ожидаемое поведение.
Insert overwrite table partition select ,,,
перезаписывает только те разделы, которые существуют в наборе данных, возвращенном select.
В вашем примере раздел state=UP
содержит записи только с city='NOIDA'
.Фильтр where city !='NOIDA'
удаляет весь раздел state=UP
из возвращенного набора данных, и поэтому он не перезаписывается.
Фильтр city !='Mumbai'
не фильтрует весь раздел, он частично возвращается, поэтому он перезаписывается отфильтрованными данными.
Работает как задумано.Рассмотрим сценарий, когда вам нужно перезаписать только нужные разделы, это вполне нормально для добавочной загрузки разделов.Вам не нужно трогать другие разделы в этом случае. Вы должны иметь возможность нормально перезаписывать только нужные разделы.И без перезаписи неизмененных разделов, что может быть очень дорого.
И если вы все еще хотите удалить разделы и изменить данные в существующих разделах, то вы можете удалить / создать таблицу (вам может потребоваться создать одинболее промежуточную таблицу для этого), а затем загрузить разделы в него.Или альтернативно вычислите разделы, которые вам нужно отбросить отдельно, и выполните ALTER TABLE DROP PARTITION
.