代码之家  ›  专栏  ›  技术社区  ›  jdowdell

流处理架构:未来事件影响过去结果

  •  2
  • jdowdell  · 技术社区  · 8 年前

    理论上,假设有一个源偶尔发出浮点值。此外,在任何给定点,都有一个乘数M,应应用于该源的值;但是M可以改变,而且关键的是,我可能只会在很久以后发现变化——甚至可能不会“按变化顺序”

    "Values": (timestamp, floating point value) - the values from the source, tagged with their emission time.
    
    "Multipliers": (timestamp, floating point multiplier) - indicates M changed to this floating point multiplier at this timestamp.
    

    然后,我会尝试使用标准流处理框架创建一个输出主题,比如“结果”,该主题将两个流连接起来,并且仅将值中的每个值与由乘数确定的当前乘数相乘。

    使用kafka和主流处理器实现/构建这一点的一些技术是什么?

    例子:

    开始

    Values = [(1, 2.4), (2, 3.6), (3, 1.0), (5, 2.2)]
    Multipliers = [(1, 1.0)]
    Results = [(1, 2.4), (2, 3.6), (3, 1.0), (5, 2.2)]
    

    Values = [(1, 2.4), (2, 3.6), (3, 1.0), (5, 2.2)]
    Multipliers = [(1, 1.0), (4, 2.0)]
    Results = [(1, 2.4), (2, 3.6), (3, 1.0), (5, 4.4)]
    

    Values = [(1, 2.4), (2, 3.6), (3, 1.0), (5, 2.2), (7, 5.0)]
    Multipliers = [(1, 1.0), (4, 2.0), (2, 3.0)]
    Results = [(1, 2.4), (2, 10.8), (3, 3.0), (5, 4.4), (7, 10.0)]
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   user1483833    8 年前

    我只熟悉Spark,为了让它像您描述的那样工作,您希望在收到新的乘数值时有选择地“更新”以前的结果,同时对尚未应用乘数的新值应用最高索引乘数。AFAIK,Spark本身不允许您使用流媒体来实现这一点(您需要缓存和更新旧结果,还需要知道新值使用的乘数),但您可以编写逻辑,将“结果”主题写入常规DB表,当您收到新乘数时,值数据框中的所有后续事件都将使用该值,但您需要做一次检查,以确定结果表中是否有现在需要更新的值,以使用新的乘数,并简单地更新DB表中的这些值。

    has a connector 为了实现这一点。

    或者,您可以使用 SnappyData