Google cloud dataflow Apache波束处理序列元

Google cloud dataflow Apache波束处理序列元,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,我有来自不同设备的GPS坐标流。这些坐标可能会出现故障,但它们都有一个事件时间。我想从GPS坐标计算总距离 从光束编程指南: 组合函数应该是可交换的和关联的,因为该函数不一定在给定键的所有值上被精确调用一次 输入: driver_id,x,y,event_time,processing_time 1,1,1,100001,20001 1,5,5,100004,20002 1,4,5,100003,20003 预期产出: driver_id, distance, event_time 1,3,1

我有来自不同设备的GPS坐标流。这些坐标可能会出现故障,但它们都有一个事件时间。我想从GPS坐标计算总距离

从光束编程指南:

组合函数应该是可交换的和关联的,因为该函数不一定在给定键的所有值上被精确调用一次

输入:

driver_id,x,y,event_time,processing_time
1,1,1,100001,20001
1,5,5,100004,20002
1,4,5,100003,20003
预期产出:

driver_id, distance, event_time
1,3,100001
1,1,100003
由于顺序很重要,我不能使用类似于
CombineFn
的任何东西

所以我的问题是:

  • 如何使用Apache beam计算事件延迟传入的距离
  • 对于位于两个不同窗口中的连续坐标,我能做些什么
  • 有没有其他可选的流处理框架可以解决我的问题
  • 活动可能在活动时间后两天交付,但我希望在确保所有活动都交付之前获得大致结果

  • 我建议你花点时间研究如何处理

    您可以创建一个固定窗口,然后允许延迟数据;但是,您还必须定义如何处理临时累积

    根据您的密钥结构,也许您可以键入驱动程序,然后提供更具体的启发式方法来确定完整性


    步骤1-了解Windows(各种类型)以及如何处理延迟到达的数据。注意:您需要用传入元素的特定时钟时间标记它们,而不是使用默认的接收时间。

    您可以获得如下事件列表:

    lists_of_events = (p
      | ReadFromPubSub()
      | Map(lambda x: (x['driver'], x))
      | WindowInto(Sessions(SESSION_GAP), 
                   allowed_lateness=ALLOWED_LATENESS,
                   accumulation_mode=ACCUMULATING)
      | GroupByKey())
    
    这将返回一个PCollection,其中包含具有驱动程序ID的元组以及每个窗口的事件列表(类型:
    Tuple[str,Iterable[Dict]]

    然后,您将编写一个函数来使用该函数:

    def calculate_distance(elm):
      driver, events = elm
      events = sorted(events, key=lambda x: x['timestamp'])
      # Now calculate distances
      distance, ev_time = ....
      yield {'driver': driver, 'distance': distance, 'event_time': ev_time}
    
    lists_of_events | Map(calculate_distance)
    

    你能添加一个示例输入和想要的输出吗?@Iñigo编辑了我的问题。埃里克回答了你的问题吗?@Pablo还没有。我不知道如何处理两个窗口之间的连续事件。