databricks delta table merge 正在插入记录,尽管键与 "WHEN NOT MATCHED THEN INSERT" 子句匹配

databricks delta table merge is inserting records despite keys are matching with "WHEN NOT MATCHED THEN INSERT" clause

我正在对 databricks delta table 执行合并操作,如下所示 -

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)  """)

尽管匹配唯一键,上述查询仍在插入重复记录。如何实现仅插入不匹配记录的输出。所有列都是键的一部分。

据我所知,一个问题可能是您插入的内容中有重复项。 WHEN NOT MATCHED THEN INSERT 不会在插入前删除重复记录。

为了不将重复项加载到 table 中,您必须在 运行 合并之前删除重复项。

您可以通过 python API:

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

或者通过SQL API:

SELECT DISTINCT(*)
FROM {your_view_name_here}

没有更多信息,这是我能提供的最佳猜测。

如果您想更新现有记录:

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)