如何在 combine.perKey in beam 中访问"key"



在如何在beam sdk 2.0中创建自定义Combine.PerKey中,我询问并得到了如何在新的beam sdk 2.0中创建自定义Combine.PerKey的正确答案。但是,我现在需要创建自定义组合PerKey,以便在我的自定义CombinePerKey逻辑中,我需要能够访问密钥的内容。这在数据流 1.x 中很容易实现,但在新的 beam sdk 2.0 中,我不确定如何做到这一点。任何小的代码片段/示例都将非常有用。

编辑#1(根据本·钱伯斯的要求(

真正的用例很难解释,但我要尝试:

我们有一个由数百万座小山丘组成的3D空间。我们尝试确定这数百万座山丘的顶点,如下所示:我们为整个3D空间创建数十亿个"矩形探针",然后我们要求这数十亿个探针中的每一个以贪婪的方式"移动"到顶点。一旦它到达顶点,它就会停止。然后,探测器返回顶点和自身。顶点是 KEY,我们将按键对其进行自定义组合。

现在,自定义组合函数最终将返回一个最终对象(称为特征(,该对象派生自到达相同顶点(即相同键(的所有探针。在生成这个"特征"对象时,我们需要知道关于最终顶点/键(即山顶(的信息。因此,我需要这个关键信息。

解决这个问题的一种方法是按键使用分组,但这很慢(至少在 df 1.x 中(;我们使用自定义组合 fn 让它很快(在 df 1.x 中(。所以,我们想要钥匙。也就是说,groupbykey 适用于 beam skd 2.0。

或者,我们可以将"顶点"信息粘贴到"探针"对象本身中,但这意味着我们数十亿个探针对象中的每一个现在都需要将大小增加三倍才能保存此顶点信息(并且此顶点信息重复自己,因为只有 100 万个顶点,但有 10 亿个探针,所以这直观地感觉效率非常低。

与其依靠 CombineFn 来计算整个结果,不如让 ComibneFn 仅根据有关探针的信息计算一些部分结果?然后,Combine.perKey(...)将返回一个PCollection<KV<Apex, InfoAboutProbes>>,您可以使用ParDo将有关顶点的信息与有关探测器的摘要信息组合在一起。这允许您使用CombineFn有效地组合有关许多探测器的信息,同时使用ParDo访问密钥。

最新更新