对于火花流,有没有办法只为当前窗口维护状态?我理解updateStateByKey
有效,但除非我们清除它,否则它将永远保持状态。是否可以存储和重置每个窗口的状态?
提供更多背景信息。我正试图在窗口流中将一种类型的对象转换为另一种对象。但是,转换如下:
对象1是调用或响应。
在我们同时看到调用和响应之前,对象2不被视为完成。
但是,由于对象的响应可能在一个单独的批处理中,我需要在批处理中维护状态。
但我只希望保持当前窗口的状态。有什么方法可以通过火花实现这一点。
谢谢你!答案 0 :(得分:0)
您可以使用mapWithState转换而不是updateStateByKey,并且您可以使用批处理间隔的持续时间设置超出状态规范的时间。这样您可以每次只有最后一批的状态。但是如果您调用它将会起作用并且响应仅取决于最后一批。当您尝试更新已删除的密钥时,其他方面将会抛出异常。 与updateStateByKey相比,MapwithState的性能更快。
您可以在下面找到示例代码段。
newstockitem:
BEGIN
DECLARE LID INT DEFAULT 0;
DECLARE GID INT DEFAULT 0;
DECLARE avXR DECIMAL(12,6) DEFAULT 1;
DECLARE `rollback` TINYINT(1) DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET `rollback` = 1;
SELECT COUNT(ID) INTO @cnt FROM Cats WHERE Parent=SCID;
IF @cnt > 0 THEN
SELECT '~hasParent';
LEAVE newstockitem;
END IF;
SELECT b.XR INTO avXR
FROM Suppliers a
LEFT JOIN Currencies b
ON b.ID = a.Currency
WHERE a.ID=SupID;
START TRANSACTION;
SELECT MAX(GroupID)+1 INTO @newGrpID FROM StockItems;
INSERT INTO StockItems (Item,
SubCatID,
Qty,
lastAudit,
AvgXR,
SupplierID,
PackPrice,
GroupID,
QtyInPack,
Ref,
Size,
Def,
PorpDef)
VALUES(Itm,
SCID,
Qnty,
Qnty,
avXR,
SupID,
PPrice,
@newGrpID,
QtyPack,
Rf,
IF(Sze>0,Sze,NULL),
1,
2);
SELECT LAST_INSERT_ID() INTO LID;
SELECT GroupID
INTO GID
FROM StockItems
WHERE ID = LID;
INSERT INTO Logs (UserID, TypeID, RelID, Datetime) VALUES(Usr, 17, LID, NOW());
**SELECT 'leave';
LEAVE newstockitem;**
IF Qnty <> 0 THEN
INSERT INTO Logs (ParentID, UserID, TypeID, RelID, QtyAdj, Datetime) VALUES(LAST_INSERT_ID(), Usr, 20, LID, Qnty, NOW());
END IF;
IF `rollback` THEN
ROLLBACK;
SELECT '~rb';
ELSE
COMMIT;
SELECT CONCAT('~succ-', GID);
END IF;
END