来自 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'
您可以使用左联接使用更新的列创建新的临时视图
SELECT T.*
, if(OSE.OfferEventSequenceId == 1, OSE.EndpointEventAmountValue, null) as OfferAmount
FROM TempOffer T
LEFT JOIN OfferSeq OSE
ON T.OfferId = OSE.OfferId