是否可以使用一次触发的触发器来减少数据量

Can a once-firing trigger be used to reduce data volume

数据集:

user: user_id, nice_id clicks: click_id, user_id, page_id, time pages: page_id, page_name output_clicks: click_id, user_nice_id, page_name, time

用户、点击和页面 pcollections 都是无限的。新版本的用户使用新名称,但他们的 nice_id 永远不会改变,新版本的页面使用新的 page_names,点击次数永远不会改变,但我们想要一个新的 output_click 如果单击的 page_name 发生变化。

所以在 page_id 上的点击和页面之间有一个 CoGroupByKey,在每个输入元素上触发一个全局 window,并重新发出该页面的每次点击,但如果我有一个类似的全局 window 和 user_id 上的按键共同分组,并在每个元素上使用 nice_id 发出每次点击,然后我们将在任何时候重新发出用户的所有点击用户更改,或者每当他们进行新的点击时。这将是很多额外的数据。

我想的是在 user_id 上的 co-group-by-key 之后,在 click_id 上有一个 group-by-key,一个新的全局 window一个只触发一次的触发器,一个基本上什么都不做的 ParDo 以便按键分组发生,然后重新建立在每个元素上触发的全局 window ,然后再加入到结果的输出在 page_id 上按键联合分组。这好像行得通?但也似乎……有点令人费解。我试着在下面画了一张图。

+-------+ +--------+ +------+ |Pages | | Clicks | | Users| +---+---+ +---+----+ +--+---+ | | | +---v----+ +---v----+ +---v----+ |R.Window| |R.Window| |R.Window| +------+-+ +---------+ ++-------+ | | | | +----v---v+ +v-----v---+ |CoGroupBy| |CoGroupBy | |page_id | |user_id |<-- also ParDo that outputs click_id,nice_id mapping +-------+-+ +------+---+ | | | +---v----+ | |O.Window| | +---+----+ | | | +----v---+ | |GroupBy | | |click_id| | +----+---+ | | | +----v--+ | |nothing| | |Pardo | | +---+---+ | | | +----v---+ | |R.Window| | +-+------+ | | +---v------------v+ | CoGroupBy | | click_id | +-------+---------+ | v Output

R.Window = 全局 window 具有重复触发新数据的触发器 O.Window = 全局 window 触发器只触发一次。

我认为这不会奏效;通过 CoGroupByUserId 获得的第一条密钥将通过,但所有后续记录都将被删除。

我建议使用带有自定义 CombineFn 的 Flatten 和 CombinePerKey,而不是使用 CoGroupByKey。 CombineFn 将在累加器中保持状态(确保在你的 Window 转换中使用 .accumulatingFiredPanes),然后可以选择仅在有新用户名时发出元素。

(旁注:您不需要 "nothing ParDo";只需 GBK 就足够了)