слияние дельта-таблиц databricks-это вставка записей, несмотря на то, что ключи совпадают с предложением «ЕСЛИ НЕ СОВПАДАЮТ, ТО ВСТАВЬТЕ» .

#apache-spark-sql #azure-databricks #delta-lake

Вопрос:

Я выполняю операцию слияния в дельта-таблице databricks, как показано ниже —

 spark.sql(""" MERGE INTO <delta table name> deltatbl USING <temp view> source
           ON   deltatbl.col1   =    source.col1
           AND  deltatbl.col2   =    source.col2
           WHEN NOT MATCHED THEN INSERT
           (col1,col2) VALUES(source.Col1,source.Col2)  """)
 

Приведенный выше запрос вставляет дубликаты записей, несмотря на совпадение уникальных ключей. Как я могу добиться вывода, в который вставляются только не совпадающие записи. все столбцы являются частью ключа.

Ответ №1:

Из того, что я вижу, одна из проблем может заключаться в том, что то, что вы вставляете, содержит дубликаты. ЕСЛИ ОНИ НЕ СОВПАДАЮТ, ВСТАВКА не выполняет дедупликацию записей перед вставкой.

Чтобы не загружать дубликаты в таблицу, вы должны выполнить дедупликацию перед запуском слияния.

Вы можете либо сделать это с помощью API python:

 spark.table('{your_view_name_here}').dropDuplicates()
 

Или через SQL API:

 SELECT DISTINCT(*)
FROM {your_view_name_here}
 

без какой-либо дополнительной информации, которая является лучшим предположением, которое я могу предоставить.

Ответ №2:

Если вы хотите обновить существующие записи:

 MERGE INTO events
USING updates
ON events.eventId = updates.eventId
WHEN MATCHED THEN
  UPDATE SET events.data = updates.data
WHEN NOT MATCHED
  THEN INSERT (date, eventId, data) VALUES (date, eventId, data)
 

Если вы хотите вставить только для несуществующих записей : Обновите с тем же значением

 MERGE INTO events
USING updates
ON events.eventId = updates.eventId
WHEN MATCHED THEN
UPDATE SET events.data = events.data
WHEN NOT MATCHED
THEN INSERT (date, eventId, data) VALUES (date, eventId, data)
 

Ваше дело ,

 MERGE INTO <delta table name> deltatbl USING <temp view> source
       ON   deltatbl.col1   =    source.col1
       AND  deltatbl.col2   =    source.col2
       WHEN MATCHED THEN
         UPDATE SET deltatbl.data = deltatbl.data
       WHEN NOT MATCHED THEN INSERT
       (col1,col2) VALUES(source.Col1,source.Col2)