我在 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”配置的目录实现。
这取决于您拥有哪种类型的表(您可以共享 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,
)