从azure databricks将数据加载到azure sql db时,错误无法在对象中插入重复的键行

pokxtpni  于 2021-05-27  发布在  Spark
关注(0)|答案(2)|浏览(432)

我在中使用以下简单的代码行将数据从azuredatabricks加载到sqldb

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中,但我不知道该怎么做,甚至不知道这样做是否正确?

xn1cxnb4

xn1cxnb41#

我建议遵循以下步骤(不要更改spark端的任何内容,而是在sql server端执行以下步骤)-
在顶部创建视图 target_table 你想在哪里写sparkDataframe数据
创建而不是插入触发器,这样所有插入命令都应该通过步骤1中创建的视图

CREATE TRIGGER <trigger_name> 
ON <view_created_in_step_1>
INSTEAD OF INSERT
AS
BEGIN
    Merge statment...

END

用于插入和更新singe语句的merge语句。遵循本教程。
如果键(not)匹配,您可能还需要查看本教程中与事务相关的查询,以更新或插入表

9lowa7mx

9lowa7mx2#

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

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

之后,尝试写入数据库。

相关问题