将数据从 Azure Databricks 加载到 Azure SQL DB 时出现错误无法在对象中插入重复键行

Error Cannot insert duplicate key row in object while loading data into Azure SQL DB from Azure Databricks

我正在使用以下简单的代码行从 Azure Databricks

将数据加载到 SQL 数据库
val loadsqldb = spark.sql("""SELECT * FROM TABLEA""")
// WRITE FROM CONFIG
val writeConfig = Config(Map(
  "url"          -> url,
  "databaseName" -> databaseName,
  "dbTable"      -> "dbo.TABLENAME",
  "user"         -> user,
  "password"     -> password,
  "connectTimeout" -> "5"
))

//~
loadsqldb.write.mode(SaveMode.Overwrite).option("truncate", true).sqlDB(writeConfig)

我们的服务器上有一个唯一的 ID 密钥,我们必须保留它,如下所示:

CREATE UNIQUE INDEX i__NeighbourhoodCategoryHourlyForecast_unique
ON almanac_devdb.dbo.NeighbourhoodCategoryHourlyForecast (fk_neighbourhoods, fk_categories, local_date, local_hour)
GO

当我尝试将数据加载到我们的 SQL 数据库时,出现以下错误;

Cannot insert duplicate key row in object 'dbo.TABLENAME' with unique index 'i__TABLENAME_unique'. The duplicate key value is (36983, 130000, 2020-08-12, 14).

有人建议我找到某种方法让 Databricks 对 OVERWRITE 进行 MERGE,但我不确定该怎么做,或者即使这是正确的做法?

删除唯一索引键的重复项。

df.dropDuplicates(Array("col1","col2"))

在此之后,尝试写入您的数据库。

我建议按照以下步骤操作(不要在 spark 端更改任何内容,而是在 sql 服务器端执行以下步骤)-

  1. Create viewtarget_table 之上,您要在其中写入 spark 数据帧数据
  2. 创建 INSTEAD OF INSERT Trigger 时,所有插入命令都应通过步骤#1 中创建的视图
CREATE TRIGGER <trigger_name> 
ON <view_created_in_step_1>
INSTEAD OF INSERT
AS
BEGIN
    Merge statment...
   
END
  1. 合并语句用于插入和更新单条语句。 Follow this tutorial.

您可能还想查看 this tutorial 以获取与交易相关的查询,以便在键(不)匹配时更新或插入 table