根据 Spark 中的匹配键删除/覆盖数据行

问题描述 投票:0回答:1

我在 Synapse (Parquet) 的 Lake 数据库中有 2 个表。它正在 Spark 中运行。 1 个包含 100 亿行的表(表 A)和其他 1000 万行(表 B)。 我想从表 A 中删除 10 个磨机行,插入/覆盖表 B 中的新数据。

这是我来自 Stored Proc 的旧 SQL 代码作为参考(不重要),但现在需要在 Spark 代码中。

Delete data1 
from TableA data1
where exists (
   select 1
   from TableB data2
   where data1.Country = data2.Country
   and data1.Year = data2.Year
   and data1.Month = data2.Month
   and data1.Store_cd = data2.Store_cd
   and data1.SKU = data2.SKU
);

Spark建议加载为df和filter,这100亿行是不可行的。

尝试了简单的删除 -> [UNSUPPORTED_FEATURE.TABLE_OPERATION] 不支持该功能:表

spark_catalog
.
dbo
.
table1
不支持删除。请检查当前的目录和命名空间以确保符合要求的限定表名,并检查由“spark.sql.catalog”配置的目录实现。

pyspark sql-delete azure-synapse
1个回答
0
投票

这取决于您拥有哪种类型的表(您可以共享 DML 吗?)以及它是如何分区的。

使用纯 apache-spark 语法,您也许可以使用 DML 命令、INSERT TABLE 或 LOAD,具体取决于数据的分区方式等。您最终可能会重写整个表(例如,如果 tableB 具有 tableA 中每个分区的数据)。

按照乔恩的建议,使用增量表格式可能会更容易。在这种情况下,您可以简单地使用

MERGE INTO
语句。比如:

MERGE INTO tableA
USING tableB
ON tableA.pk1 = tableB.pk1 AND tableA.pk2 = tableB.pk2
WHEN MATCHED
  THEN UPDATE SET
    pk1  = tableB.pk1,
    pk2  = tableB.pk2,
    col1 = tableB.col1,
    col2 = tableB.col2
WHEN NOT MATCHED
  THEN INSERT (
      ...
  )
  VALUES (
    tableB.pk1,
    tableB.pk2,
    tableB.col1,
    tableB.col2,
  )

© www.soinside.com 2019 - 2024. All rights reserved.