Python 确保在apache beam中的多个工作进程上正确聚合用户会话数据
假设我将以下会话数据拆分为两个工作进程:Python 确保在apache beam中的多个工作进程上正确聚合用户会话数据,python,google-cloud-dataflow,apache-beam,Python,Google Cloud Dataflow,Apache Beam,假设我将以下会话数据拆分为两个工作进程: +---------+-----------+--------+ | user_id | timestamp | worker | +---------+-----------+--------+ | 1 | 2 | 1 | | 1 | 1 | 1 | | 1 | 21 | 1 | | 1 | 23 | 2
+---------+-----------+--------+
| 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 |
+---------+---------------+-------------+---------------+
而不是以下结果:
+---------+---------------+-------------+---------------+
| 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 |
+---------+---------------+-------------+---------------+
例如,在用例中,我必须按用户id对输入进行分区,以便在将其拆分为会话窗口之前获得用户的所有会话数据
我的问题是:
- ApacheBeam是否自动确保每个工人都拥有所有数据
- 例如,此代码段是否确保所有用户会话都是 即使数据被拆分为多个工作人员,是否正确地进行了agreggated
将apache_梁导入为梁
从apache_beam.transforms.window导入会话
(pcoll
|梁.窗(会话(间隙尺寸=10))
|beam.GroupByKey())
- 如果是这样,它如何确切地保证这种行为
- 如何在本地复制此特定情况,以便对其进行测试
- 我是否可以在文档中阅读更多有关此行为的信息
- 窗口转换根据每个元素的时间戳将其分配到一个或多个窗口中
- GroupByKey转换隐式地按键和窗口分组,即,对于每个键/窗口对,它使用该键和窗口维护元素缓冲区
- 如果windowfn正在“合并”(即,如果具有相同键的不同元素的窗口不是独立的,就像会话窗口一样),它将为具有该键的所有元素重新计算正确的窗口集,并将每个元素重新映射到相应的新窗口中。(
)mergeWindows
使用在内存中本地运行管道的direct runner,并提供梁模型的参考实现。Hi,对我来说,还有一些事情没有解决。因此,如果我想合并运行程序在多个worker上拆分的用户会话数据,例如,dataflow runner是否自动保证每个会话的生成独立于在worker上拆分的会话,或者我是否必须对数据进行分区,因此,每个工作人员只获取特定用户的数据?我不确定您的确切意思-似乎您假设了一个特定的会话实现,其中分区非常重要,但Beam以一种不重要的方式实现了它。您将得到正确的结果,控制分区不仅是不必要的,而且是不可能的(“Spark意义上的分区”不是Beam编程模型的一部分)