Я пытаюсь выполнить операцию вставки в вызове слияния 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, который создает новые файлы только при вставке фактических строк?