簡體   English   中英

將數據從 spark 數據幀插入到 SQL Server 中的表中

[英]INSERT data from spark dataframe to a table in SQL server

我在 Databricks 上使用 Scala Notebook。 我需要將數據從數據幀插入到 SQL 服務器中的表中。 如果數據已經存在,不需要修改或插入——只插入不存在的數據。

我嘗試了此處指定的方法https://docs.databricks.com/spark/latest/data-sources/sql-databases.html#write-data-to-jdbc ,但是,它們沒有解決我的用例。 SaveMode.Append 創建數據的重復條目, SaveMode.Overwrite 替換現有數據(表),如果表已存在, SaveMode.Ignore 不會添加任何新數據。

df.write.mode(SaveMode.Overwrite).j​​dbc(url=dbUrl, table=table_name, dbConnectionProperties)

如何僅向數據庫插入新數據?

非常感謝您的幫助!

假設您當前的數據幀是 df1。

您應該將 SQL 表中的現有數據讀入另一個數據框 (df2)。 然后使用subtract(或subtractByKey): http : //spark.apache.org/docs/latest/api/python/pyspark.html?highlight= subtract

val dfFinal = df1.subtract(df2)

dfFinal 將包含要插入的剩余記錄。

注意: - 這是一種解決方法。 不是一個完整的證明解決方案。

這個問題可以有一個解決方法。 您需要在 SQL 服務器表中維護一個自增鍵/主鍵。 並且源數據也應該在插入之前在數據中具有此鍵。

可能出現以下情況:

New Primary key == Old Primary key -> job will fail with constraints exception.
New Primary key != Old Primary key -> insert successfully.

插入表失敗可以在程序級別處理。

為了避免引入整個集合進行比較,您可以在 SQL 表上放置一個唯一索引並使用忽略重復項的選項。

MS 文檔:創建唯一索引

CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
    ON <object> ( column [ ASC | DESC ] [ ,...n ] )
    [ INCLUDE ( column_name [ ,...n ] ) ]
    [ WHERE <filter_predicate> ]
    [ WITH ( <relational_index_option> [ ,...n ] ) ]
    [ ON { partition_scheme_name ( column_name )
         | filegroup_name
         | default
         }
    ]
    [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]

[ ; ]

<object> ::=
{ database_name.schema_name.table_or_view_name | schema_name.table_or_view_name | table_or_view_name }

<relational_index_option> ::=
{
  | IGNORE_DUP_KEY = { ON | OFF }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM