在How to create custom Combine.PerKey in beam sdk 2.0中,我询问了如何在新的光束sdk 2.0中创建自定义Combine.PerKey的正确答案。但是,我现在需要创建一个自定义combinePerKey,以便在我的自定义CombinePerKey逻辑中,我需要能够访问密钥的内容。这在数据流1.x中很容易实现,但在新的光束sdk 2.0中,我不确定如何这样做。任何小的代码片段/示例都非常有用。
编辑#1(根据Ben Chambers的要求)
真实的用例很难解释,但我会尝试:
我们有一个由数百万个小山丘组成的三维空间。我们试图确定这些数百万山丘的顶点如下:我们创建了数十亿个矩形探针"对于整个3d空间,然后我们要求这些数十亿的探针中的每一个都移动"以一种贪婪的方式走向顶点。一旦它击中顶点,它就会停止。然后探针返回顶点和自身。顶点是我们按键进行自定义组合的KEY。
现在,自定义组合函数将最终返回最终对象(称为特征),该对象派生自到达相同顶点的所有探针(即相同的密钥)。生成此"功能"对象,我们需要知道关于最终顶点/键(即山顶)的信息。因此,我需要这个关键信息。
解决这个问题的一种方法是使用按键分组,但这很慢(至少在df 1.x中);我们使用自定义组合fn快速(在df 1.x中)。所以,我们喜欢钥匙。也就是说,groupbykey在beam skd 2.0中工作。
或者,我们可以坚持使用" apex"信息进入"探测"对象本身,但这意味着我们每个数十亿的探测对象现在需要增加三倍才能保存这个顶点信息(并且这个顶点信息会自行重复,因为只有100万个顶点但是有10亿个探测器,所以这个直觉上感觉非常低效。)
答案 0 :(得分:0)
而不是依靠CombineFn来计算整个结果,您是否可以让ComibneFn仅基于有关探针的信息来计算某些部分结果?然后,您的Combine.perKey(...)
会返回PCollection<KV<Apex, InfoAboutProbes>>
,您可以使用ParDo
将有关顶点的信息与有关探针的摘要信息进行组合。这允许您使用CombineFn
有效地组合有关许多探针的信息,同时使用ParDo
来访问密钥。