Databricks:将数据框合并到 Azure 突触表中

Posted

技术标签:

【中文标题】Databricks:将数据框合并到 Azure 突触表中【英文标题】:Databricks: Merge dataframe into Azure synapse table 【发布时间】:2021-03-13 05:39:12 【问题描述】:

有什么方法可以将数据框合并到 Azure Synapse 表中? 我为 dataframe.write.mode() 找到了什么

只允许追加和覆盖...有什么解决办法吗?

【问题讨论】:

【参考方案1】:

如果您的意思是 upsert:Synapse 不支持 upsert

你必须自己做 delete 后跟 insert 来模仿 upsert。

这假设您的新数据是完整的(即它不仅容器更改列值,而且具有所有列值)。如果没有,那么您将不得不从 Synapse 读取另一个数据帧,将它们合并到 Spark/Databricks 中,然后执行 upsert。

您也可以使用 Synapse 中的临时表执行此操作,并使用 Synapse 的计算来执行 upsert 而不是 Spark 的计算。


如果没有,那么您将不得不从 Synapse 读取另一个数据帧,将它们合并到 Spark/Databricks 中,然后执行 upsert。

详细说明:

如果你在数据库中有这个:

k,a,b
1,1,1
2,2,2

这是您尝试写入 DB 的数据框(例如 df_new):

k,a
1,11
3,3

这就是您期望数据库在更新后的样子:

k,a,b
1,11,1
2,2,2
3,3,null

然后你需要创建一个数据框df_current_db,它有:

k,a,b
1,1,1

注意:您只需要存在于df_new 中的密钥,而不是全部。

然后合并df_current_dbdf_new 以创建一个新的df_upsert,它具有:

k,a,b
1,11,1
3,3,null

最后你必须更新:

delete from DB where k in (select k from df_upsert) insert into DB (select * from df_upsert)

【讨论】:

"如果没有,那么您将不得不从 Synapse 读取另一个数据帧,将它们合并到 Spark/Databricks 中,然后执行 upsert。" @mytabi 更新为详细说明。 HTH。 df_upsert 需要先放回 Synapse 数据库吗?在删除和插入之前?因为我认为删除和插入不能直接对从突触读取的数据帧执行...... @mytabi 将df_upsert 放入数据库是insert into DB (select * from df_upsert) 的最后一步。是的,除非您将数据框 write 更改为 DB,否则更改数据框对 DB 内容没有影响。

以上是关于Databricks:将数据框合并到 Azure 突触表中的主要内容,如果未能解决你的问题,请参考以下文章

在 Azure Databricks 中编写 spark 数据框

从 Azure Databricks Notebook 访问 SQL Server

如何使用 Python / Pyspark 在 Databricks 笔记本中合并数据帧

将数据存储到 PySpark (Azure - DataBricks) 中的数据库非常慢

Azure Databricks:如何过滤数据框中不包含类似运算符的列?

使用 /mnt/ 将数据从 Azure Blob 存储读取到 Azure Databricks