Pyspark PySaprk-使用Databricks Spark在Synapse中执行合并

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内部,

在使用Databricks Spark执行酸性操作时,我们遇到了一个棘手的情况。 我们希望使用PySpark通过JDBC连接在Azure Synapse表上执行UPSERT。我们知道Spark仅提供两种写入数据的模式追加和覆盖(在本例中,只有这两个使用full)。基于这两种模式,我们考虑了以下选项:

  • 我们将把整个数据帧写入一个stage表。我们将使用此stage表对最终表执行合并操作(~UPSERT)。在此之后,stage表将被截断/删除

  • 我们还将把目标表数据引入Spark。在Spark内部,我们将使用Delta lake执行合并,并将生成最终的数据帧。此数据帧将以覆盖模式写回目标表

  • 考虑到缺点。两边

    在选项1中,我们必须使用两个表来写入最终数据。在这种情况下,阶段表和目标表都很大,那么在Synapse内执行合并操作是另一项艰巨的任务,可能需要时间

    在选项2中,我们必须将目标表放入内存中的Spark中。尽管网络IO不太受我们的关注,因为Databricks和Synpse将位于同一Azure AZ中,但它可能会导致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固定费率付费,尽管只有在您升级时,您的使用率才高,但在其他情况下,使用率相当低
    • 最后,请记住,撰写本文时,
      MERGE
      处于预览状态。意味着没有Sev-A支持案例/如果您的产品因使用MERGE而出现故障,则立即提供支持。
      • 您可以始终使用
        DELETE
        +
        INSERT
        。假设您收到的增量包含目标表中的所有列,而不仅仅是更新的列

    答案取决于您问题中未列出的许多因素。这是一个非常开放的问题

    (考虑到您的问题的措辞,我假设您使用的是专用的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,您必须为每次向上插入(放大、向上插入、sca)留出40-80分钟的停机时间