如何使用pyspark将数据写入Azure SQL数据库?

o2rvlv0m  于 4个月前  发布在  Spark
关注(0)|答案(1)|浏览(73)

我使用以下代码将数据写入Azure SQL数据库:

def write_to_sqldatabase(final_table, target_table):
    #Write table data into a spark dataframe
    final_table.write.format("jdbc") \
        .option("url", f"jdbc:sqlserver://{SERVER};databaseName={DATABASE}") \
        .option("dbtable", f'....{target_table}') \
        .option("user", USERNAME) \
        .option("password", PASSWORD) \
        .mode("append") \
        .save()

字符串
这不再起作用。我现在得到以下错误:
Py 4JJava错误:调用o11913.save时出错。:org.apache.spark.SparkException:由于阶段失败而中止作业:阶段63.0中的任务2失败了4次,最近一次失败:阶段63.0中丢失任务2.3(TID 322)(vm-32517978 executor 1):异常:违反PRIMARY KEY约束“PK_tblSFDC_Account”。无法在对象“..... table”中插入重复键。重复键值为(0xxxxxx)。
以前我也有这个问题,但通过截断sql数据库中的表来修复它。
现在我试着做同样的事情,但我保留了违反的错误。
怎么会这样?

wixjitnu

wixjitnu1#

违反PRIMARY KEY约束“PK_tblSFDC_Account”。无法在对象“..... table”中插入重复键。重复键值为(0xxxxxx)。
您看到的错误消息表明SQL Server数据库中的主键约束存在问题。此约束用于确保表中的每一行都是唯一的,并且可以由唯一键标识。错误消息表明存在违反此约束的情况,这意味着表中存在重复的行或具有非唯一键的行。您可能需要检查数据并确保每行具有唯一的键值。
我同意@ WARKA当你在尝试将数据插入到空表中时遇到这个错误时,这意味着你试图添加的信息在指定为主键的列中有多行具有相同的值。主键确保每行是不同的,并且可以通过唯一的键来识别。由于你的表最初是空的,这个错误表明你试图插入的数据与这个唯一性要求相矛盾。似乎你的数据中有重复键值的行。
我在SQL数据库中插入一个空表:x1c 0d1x示例数据:

data = [(1, "Movie 1"), (2, "Movie 2"), (1, "Duplicate Movie")]
columns = ["movie_id", "title"]

字符串

**(1,“重复电影”)**为PK相同的重复记录。

final_table = final_table.dropDuplicates(["movie_id"])
target_table = "movies"
final_table.write.format("jdbc") \
    .option("url", jdbcUrl) \
    .option("dbtable", target_table) \
    .option("user", connectionProperties["user"]) \
    .option("password", connectionProperties["password"]) \
    .mode("append") \
    .save()


final_table = final_table.dropDuplicates([“movie_id”])**
如果在该框架中碰巧有任何重复,此过程将确保删除它们。

结果:

在SQL中,你也可以使用(CTE)来删除重复的行:

WITH CTE AS (
    SELECT 
        movie_id,
        title,
        ROW_NUMBER() OVER (PARTITION BY movie_id ORDER BY (SELECT NULL)) AS RowNum
    FROM [dbo].[movies]
)
DELETE FROM CTE WHERE RowNum > 1;

相关问题