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_db
和df_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) 中的数据库非常慢