假设我将以下会话数据分为两个工作人员:
+---------+-----------+--------+
| user_id | timestamp | worker |
+---------+-----------+--------+
| 1 | 2 | 1 |
| 1 | 1 | 1 |
| 1 | 21 | 1 |
| 1 | 23 | 2 |
| 1 | 24 | 2 |
+---------+-----------+--------+
我想确保如果我收集数据,我将得到以下结果:
+---------+---------------+-------------+---------------+
| user_id | session_start | session_end | element_count |
+---------+---------------+-------------+---------------+
| 1 | 1 | 2 | 2 |
| 1 | 21 | 24 | 3 |
+---------+---------------+-------------+---------------+
而不是以下结果:
+---------+---------------+-------------+---------------+
| user_id | session_start | session_end | element_count |
+---------+---------------+-------------+---------------+
| 1 | 1 | 2 | 2 |
| 1 | 21 | 21 | 1 |
| 1 | 23 | 24 | 2 |
+---------+---------------+-------------+---------------+
例如在this用例中,我必须按用户ID对输入进行分区,以便在将用户分成会话窗口之前获取用户的所有会话数据。
我的问题是:
import apache_beam as beam
from apache_beam.transforms.window import Session
(pcoll
| beam.WindowInto(Session(gap_size=10))
| beam.GroupByKey())
答案 0 :(得分:0)
Apache Beam是否会自动确保每个工作人员都拥有所有数据? 例如,此代码段是否确保所有用户会话都正确收集,即使数据是分散在多个工作人员上的?
Apache Beam语义不依赖于哪个工作者处理哪些数据。由特定的Beam运行器来确保它正确执行管道。如果某个跑步者需要收集一名工人的所有数据来做 - 那么那个跑步者应该这样做;如果跑步者能够保证正确性而不做到这一点 - 甚至更好。
如果是这样,它究竟是如何保证这种行为的呢?
有效评估窗口和触发器的确切实现细节非常复杂。您可以在ReduceFnRunner中查看java实现。但是在高层次上,你可以这样想(这只是一个心理模型,而不是一个确切的实现):
mergeWindows
)如何在本地复制这种特定情况,以便对其进行测试?
使用在本地内存管道的直接运行器,并提供Beam模型的参考实现。