MERGE 使用 Spark SQL 更新表的列

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

来自 MS SQL 背景,我正在尝试在 Spark SQL 中编写一个查询,它通过使用过滤器内部连接新表 B 来简单地更新表 A(源表)的列值。

MS SQL 查询如下所示:

UPDATE T
SET T.OfferAmount = OSE.EndpointEventAmountValue
FROM #TempOffer T
INNER JOIN OfferSeq OSE
    ON OSE.OfferId = T.OfferID
    AND OSE.OfferEventSequenceId = 1

因为 spark sql 不喜欢 UPDATE 命令,所以我一直在使用 MERGE 来更新记录——正如 这篇文章 中所建议的——这对于没有过滤器的情况来说效果很好。但是当下面的 spark sql 查询中有像“OSE.OfferEventSequenceId = 1”这样的过滤器时,我不确定应该在哪里添加过滤器(我在这里添加了一个 WHERE 子句但不确定这是否是正确的语法):

%sql
MERGE into TempOffer VIEW
USING OfferSeq OSE ON VIEW.OfferId = OSE.OfferID
WHERE OSE.OfferId = 1
WHEN MATCHED THEN UPDATE set VIEW.OfferAmount = OSE.EndpointEventAmountValue;

此外,如果我们想在下面的 MS SQL 查询中执行 LEFT JOIN,我们如何使用 MERGE 或其他函数来更新 spark SQL 中的记录?

UPDATE OSE
SET OSE.ResponseTimeAfterLastAmountChangeInMilliseconds = NULL
FROM OfferSeq OSE
LEFT JOIN Employee DE
    ON DE.EmployeeID = OSE.TriggeredByID
WHERE OSE.EndpointEventSourceRole = 'Won'
apache-spark pyspark apache-spark-sql databricks databricks-sql
1个回答
0
投票

您可以使用左联接使用更新的列创建新的临时视图

SELECT T.*
   , if(OSE.OfferEventSequenceId == 1, OSE.EndpointEventAmountValue, null) as OfferAmount
FROM TempOffer T
LEFT JOIN OfferSeq OSE
   ON T.OfferId = OSE.OfferId
© www.soinside.com 2019 - 2024. All rights reserved.