Pyspark PySaprk-使用Databricks Spark在Synapse中执行合并
在使用Databricks Spark执行酸性操作时,我们遇到了一个棘手的情况。 我们希望使用PySpark通过JDBC连接在Azure Synapse表上执行UPSERT。我们知道Spark仅提供两种写入数据的模式追加和覆盖(在本例中,只有这两个使用full)。基于这两种模式,我们考虑了以下选项:Pyspark PySaprk-使用Databricks Spark在Synapse中执行合并,pyspark,databricks,azure-databricks,azure-synapse,spark3,Pyspark,Databricks,Azure Databricks,Azure Synapse,Spark3,在使用Databricks Spark执行酸性操作时,我们遇到了一个棘手的情况。 我们希望使用PySpark通过JDBC连接在Azure Synapse表上执行UPSERT。我们知道Spark仅提供两种写入数据的模式追加和覆盖(在本例中,只有这两个使用full)。基于这两种模式,我们考虑了以下选项: 我们将把整个数据帧写入一个stage表。我们将使用此stage表对最终表执行合并操作(~UPSERT)。在此之后,stage表将被截断/删除 我们还将把目标表数据引入Spark。在Spark内部,
还有其他可行的选择吗??或者有任何建议吗?您是否尝试创建校验和以仅对实际数据更改的行执行合并追加插入?您是否尝试创建校验和以仅对实际数据更改的行执行合并追加插入?答案取决于您问题中未列出的许多因素。这是一个非常开放的问题 (考虑到您的问题的措辞,我假设您使用的是专用的SQL池,而不是按需Synapse) 以下是一些想法:
- 您将在选项1中使用spark cluster的计算,在选项2中使用Synapse的计算。比较成本。
- 选择较低的成本
- 使用他们的驱动程序在Spark和Synapse之间进行读写,并将Datalake用作后台。也就是说,在Spark中将表格从Synapse读取到datafrmae时,驱动程序将首先使Synapse将数据导出到Datalake(作为拼花IIRC),然后读取Datalake中的文件以创建数据帧。如果你说的是10行、100万行或数十亿行,这个比例会很好。但如果行数较低(10-100千行),则开销可能会成为性能开销。
- 测试并选择更快的一个
- 请记住,Synapse不像传统的MySQL或SQL Server。这是一个MPPDB。
是一个错误的说法。它的规模就像一个火花簇“在Synapse内部执行合并操作是另一项艰巨的任务,可能需要时间”
,是和否。一方面,所有数据不会加载到单个工作节点中。是的,每个节点都需要足够的内存来完成自己的部分它可能会导致Spark端的内存问题
- 虽然Synapse可以动态地放大和缩小,但我已经看到完成放大需要40分钟。另一方面,Databricks是完全按需的,您可能可以通过打开集群、执行upsert、关闭集群来逃脱。使用Synapse,您可能会有其他客户端使用它,因此可能无法关闭它。
- 因此,使用Synapse,您必须为每次向上插入(放大、向上插入、向下插入)留出40-80分钟的向下插入时间,或者
- 始终为高DWU固定费率付费,尽管只有在您升级时,您的使用率才高,但在其他情况下,使用率相当低
- 最后,请记住,撰写本文时,
处于预览状态。意味着没有Sev-A支持案例/如果您的产品因使用MERGE而出现故障,则立即提供支持。MERGE
- 您可以始终使用
+DELETE
。假设您收到的增量包含目标表中的所有列,而不仅仅是更新的列INSERT
- 您可以始终使用
- 您将在选项1中使用spark cluster的计算,在选项2中使用Synapse的计算。比较成本。
- 选择较低的成本
- 使用他们的驱动程序在Spark和Synapse之间进行读写,并将Datalake用作后台。也就是说,在Spark中将表格从Synapse读取到datafrmae时,驱动程序将首先使Synapse将数据导出到Datalake(作为拼花IIRC),然后读取Datalake中的文件以创建数据帧。如果你说的是10行、100万行或数十亿行,这个比例会很好。但如果行数较低(10-100千行),则开销可能会成为性能开销。
- 测试并选择更快的一个
- 请记住,Synapse不像传统的MySQL或SQL Server。这是一个MPPDB。
是一个错误的说法。它的规模就像一个火花簇“在Synapse内部执行合并操作是另一项艰巨的任务,可能需要时间”
,是和否。一方面,所有数据不会加载到单个工作节点中。是的,每个节点都需要足够的内存来完成自己的部分它可能会导致Spark端的内存问题
- 虽然Synapse可以动态地放大和缩小,但我已经看到完成放大需要40分钟。另一方面,Databricks是完全按需的,您可能可以通过打开集群、执行upsert、关闭集群来逃脱。使用Synapse,您可能会有其他客户端使用它,因此可能无法关闭它。
- 因此,使用Synapse,您必须为每次向上插入(放大、向上插入、sca)留出40-80分钟的停机时间