![](/img/trans.png)
[英]How to use Bulk insert to insert data from Dataframe to SQL Server table?
[英]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).jdbc(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 表上放置一個唯一索引並使用忽略重復項的選項。
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.