在使用 Databricks Spark 执行 ACID 操作时,我们遇到了一个棘手的情况。我们希望使用 PySpark 通过 JDBC 连接对 Azure Synapse 表执行 UPSERT。我们知道 Spark 只提供了 2 种数据写入模式。APPEND和OVERWRITE(在我们的例子中只有这两个使用 full)。因此,基于这两种模式,我们想到了以下选项:
我们将把整个数据框写入一个阶段表。我们将使用这个阶段表对最终表执行 MERGE 操作(~UPSERT)。阶段表将在此之后被截断/删除。
我们还将把目标表数据带入 Spark。在 Spark 内部,我们将使用 Delta Lake 执行 MERGE,并将生成最终的 Dataframe 。此数据帧将以 OVERWRITE 模式写回 Target 表。
考虑到缺点。双方..
在选项 1 中,我们必须使用两个表来写入最终数据。如果 Stage 和 target 表都很大,那么在 Synapse 中执行 MERGE 操作是另一项艰巨的任务,可能需要时间。
在选项 2 中,我们必须将 Target 表放入内存中的 Spark。尽管网络 IO 不是我们关心的问题,因为 Databricks 和 Synpse 都在同一个 Azure AZ 中,但它可能会导致 Spark 端的内存问题。
还有其他可行的选择吗??或者有什么推荐吗??