Google cloud dataflow Apache波束处理序列元
我有来自不同设备的GPS坐标流。这些坐标可能会出现故障,但它们都有一个事件时间。我想从GPS坐标计算总距离 从光束编程指南: 组合函数应该是可交换的和关联的,因为该函数不一定在给定键的所有值上被精确调用一次 输入: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
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
的任何东西
所以我的问题是:
我建议你花点时间研究如何处理 您可以创建一个固定窗口,然后允许延迟数据;但是,您还必须定义如何处理临时累积 根据您的密钥结构,也许您可以键入驱动程序,然后提供更具体的启发式方法来确定完整性
步骤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还没有。我不知道如何处理两个窗口之间的连续事件。