如何解决PySaprk-使用Databricks Spark在Synapse中执行合并
使用Databricks Spark执行ACID操作时,我们遇到了一个棘手的情况。 我们希望使用PySpark通过JDBC连接在Azure Synapse表上执行UPSERT。我们知道Spark仅提供两种写入数据的模式。 APPEND 和 OVERWRITE (在我们的案例中,只有这两个使用完整)。因此,基于这两种模式,我们想到了以下选项:
1) We will write whole dataframe into a stage table . And we will use this stage table to perform MERGE operation( ~ UPSERT )with final Table .Stage table will be truncated / dropped after that .
2) We Will bring target table data into Spark also. Inside Spark We will perform MERGE using Delta lake and will generate a final Dataframe .This dataframe will be written back to Target table in OVERWRITE mode.
考虑缺点。侧面..
在选项1中,我们只需要使用两个表来写入最终数据。并且,如果Stage和target表都很大,那么在Synapse中执行MERGE操作是另一项艰巨的任务,可能会花费一些时间。
在选项2中,我们必须将Target表放入Spark内存中。尽管网络IO并不是我们关注的重点,因为Databricks和Synpse都将位于同一Azure AZ中,但这可能会导致Spark端出现内存问题。
还有其他可行的选择吗?或任何建议??
解决方法
您是否尝试创建校验和以仅对具有实际数据更改的行进行合并加粗?
,答案取决于您的问题中未列出的许多因素。这是一个非常开放的问题。
(鉴于您的问题的措辞方式,我假设您使用的是专用 SQL 池而不是按需突触)
这里有一些想法:
- 您将在选项 1 中使用 Spark 集群的计算,在选项 2 中使用 Synapse 的计算。比较成本。
- 选择较低的成本。
- 使用他们的驱动程序从 Spark 读取和写入/从 Synapse 写入,使用 Datalake 作为阶段。 IE。将 Synapse 中的表读入 Spark 中的 datafrmae 时,驱动程序将首先使 Synapse 将数据导出到 Datalake(作为 parquet IIRC),然后读取 Datalake 中的文件以创建 Dataframe。如果您谈论的是 10 行或数百万或数十亿行,则可以很好地扩展。但是,如果行数很低(10-100 万),开销可能会变成性能开销。
- 测试并选择更快的。
- 请记住,Synapse 与传统的 MySQL 或 SQL-Server 不同。这是一个 MPP 数据库。
-
"performing MERGE operation inside Synapse is another herculean task and May take time"
是错误的陈述。它可以像 Spark 集群一样扩展。 -
It may leads to memory issue in Spark side
,是和否。一方面,所有数据都不会加载到单个工作节点中。 OTOH 是的,每个节点都需要足够的内存来完成它自己的部分。
-
- 虽然 Synapse 可以动态放大和缩小,但我看到完成放大最多需要 40 分钟。另一方面,Databricks 是完全按需的,您可能可以通过打开集群、执行更新插入、关闭集群来摆脱困境。使用 Synapse,您可能会有其他客户端使用它,因此可能无法将其关闭。
- 因此,对于 Synapse,您要么必须忍受每次更新插入(放大、更新插入、缩小)的 40-80 分钟停机时间,要么
- 一直为高 DWU 固定费率付费,尽管您的使用率仅在您升级时才很高,但否则就很低。
- 最后,请记住
MERGE
在撰写本文时处于预览状态。意味着没有 Sev-A 支持案例/如果您的产品因为使用 MERGE 而出现问题,则没有立即支持。- 您始终可以改用
DELETE
+INSERT
。假设您收到的增量包含目标表中的所有列,而不仅仅是更新的列。
- 您始终可以改用
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。