Spark流媒体维护状态超过窗口

时间:2018-02-28 22:12:32

标签: java apache-spark spark-streaming

对于火花流,有没有办法只为当前窗口维护状态?我理解updateStateByKey有效,但除非我们清除它,否则它将永远保持状态。是否可以存储和重置每个窗口的状态?

提供更多背景信息。我正试图在窗口流中将一种类型的对象转换为另一种对象。但是,转换如下:

对象1是调用或响应。

在我们同时看到调用和响应之前,对象2不被视为完成。

但是,由于对象的响应可能在一个单独的批处理中,我需要在批处理中维护状态。

但我只希望保持当前窗口的状态。有什么方法可以通过火花实现这一点。

谢谢你!

1 个答案:

答案 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