【发布时间】:2021-03-13 05:39:12
【问题描述】:
有什么方法可以将数据框合并到 Azure Synapse 表中? 我为 dataframe.write.mode() 找到了什么
只允许追加和覆盖...有什么解决办法吗?
【问题讨论】:
有什么方法可以将数据框合并到 Azure Synapse 表中? 我为 dataframe.write.mode() 找到了什么
只允许追加和覆盖...有什么解决办法吗?
【问题讨论】:
如果您的意思是 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)【讨论】:
df_upsert 放入数据库是insert into DB (select * from df_upsert) 的最后一步。是的,除非您将数据框 write 更改为 DB,否则更改数据框对 DB 内容没有影响。