Вставка Delta Lake перезаписывает данные, даже если условие вставки не выполняется

Я пытаюсь выполнить операцию вставки в вызове слияния Delta Lake (python api) с условием, что id строки еще не должно существовать в таблице delta Lake, т.е.:

delta_table.alias('delta_table') \
           .merge(df.alias('df'), 'delta_table.id = df.id') \
           .whenNotMatchedInsertAll() \
           .execute()

Однако это слияние перезаписывает файлы паркета в Delta Lake каждый раз, когда вызывается операция слияния, независимо от того, вставляются новые строки или нет. Причина, по-видимому, в том, что условие в операторе слияния ('delta_table.id = df.id') автоматически запускает перезапись, если условие выполняется (см. Delta Lake MERGE / UPDATE перезаписывает данные, даже если условие не выполняется).

Я бы попытался просто инвертировать логику, т.е.:

delta_table.alias('delta_table') \
           .merge(df.alias('df'), 'delta_table.id != df.id') \
           .whenMatchedInsertAll() \
           .execute()

Однако whenMatchedInsertAll или whenMatchedInsert недоступны в API.
Как выполнить слияние с помощью Python, который создает новые файлы только при вставке фактических строк?


person 0vbb    schedule 08.03.2021    source источник