Google cloud dataflow “如何访问”;“关键”;在联合收割机中,珀基在光束中

Google cloud dataflow “如何访问”;“关键”;在联合收割机中,珀基在光束中,google-cloud-dataflow,Google Cloud Dataflow,在年,我询问了如何在新的beam sdk 2.0中创建自定义Combine.PerKey,并得到了正确答案。但是,我现在需要创建一个自定义combinePerKey,以便在自定义combinePerKey逻辑中,我需要能够访问密钥的内容。这在Dataflow1.x中很容易实现,但在新的BeamSDK2.0中,我不确定如何实现。任何小代码片段/示例都将非常有用 编辑#1(根据本·钱伯斯的要求) 真正的用例很难解释,但我将尝试: 我们有一个由数百万小山组成的3d空间。我们试图确定这数百万个山丘的顶点

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

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

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

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

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

解决这一问题的一种方法是使用按键分组,但速度很慢(至少在df1.x中是这样);我们使用定制的联合收割机fn使其速度更快(在df1.x中)。所以,我们想要钥匙。也就是说,groupbykey在beam skd 2.0中工作


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

与其依赖CombineFn来计算整个结果,不如让ComibeFn仅根据有关探测的信息计算部分结果?然后您的
Combine.perKey(…)
返回一个
PCollection
,您可以使用
ParDo
组合关于顶点的信息和关于探针的摘要信息。这允许您使用
CombineFn
有效地组合关于多个探针的信息,同时使用
ParDo
访问密钥。

而不是rel如果使用CombineFn计算整个结果,您是否可以让combnefn仅根据有关探测的信息计算部分结果?然后使用
Combine.perKey(…)
返回一个
PCollection
,您可以使用
ParDo
组合关于顶点的信息和关于探针的摘要信息。这允许您使用
CombineFn
有效组合关于多个探针的信息,同时使用
ParDo
访问密钥。

您能详细说明一下吗在您的用例中?我们删除了
CombineFn
s访问键的功能,因为它通常被误用。我们看到的大多数情况都可以通过预处理输入或使用访问键的DoFn对输出进行后处理来处理。@BenChambers我在上面的“编辑#1”下添加了用例@BenChambers只是把这一个加起来…有什么想法吗?你能详细说明一下你的用例吗?我们删除了
CombineFn
s访问密钥的功能,因为它通常被误用。我们看到的大多数情况都可以通过预处理输入或使用访问密钥的DoFn对输出进行后处理来处理。@BenChambers I a上面“编辑#1”下的dded用例@BenChambers只是把这个添加到上面…有什么想法吗?