繁体   English   中英

将 Apache Beam Transform 的输入转发并合并到其 output

[英]Forward and merge input of Apache Beam Transform to its output

假设我有一个数据转换(如地图),它接受一些字典输入并输出一些其他字典我无法控制转换的 output 字典中的确切内容,我想将整个输入字典与 output 字典合并变换产生的。

import apache_beam as beam


with beam.Pipeline() as pipeline:
  (pipeline 
   | 'Create data' >> beam.Create([
          {'A': 2},
          {'A': 3},
      ])
   | 'Transform' >> beam.Map(lambda d: {'B': d['A']*2})

我该怎么做才能有效地将 Map 输入数据与结果合并(假设我无法更改 Map 中的 function 以返回原始 A)。 因此,预期的集合将是: [{'A': 2, 'B': 4}, {'A': 3, 'B': 6}]

我假设通过这个

(假设我无法更改 Map 中的 function 以返回原始 A)

你的意思是出于某种原因你无法简单地从已经合并的转换中返回字典。

我建议以原始字典和相应的转换后的字典共享相同密钥的方式对数据进行键控。 然后使用Combine.PerKey合并共享相同键的字典。

所以一步一步,首先你要写一个beam.Map来将每个输入字典与随机生成的键(或者其他一些唯一标识的属性,如果已经存在的话)相关联。 然后,当您转换字典时,请确保保留密钥。 然后将两个带键的 PCollection(在转换之前和之后)提供给Flatten以将它们放在同一个 PCollection 中,然后通过GroupByKey将“之前”和“之后”的字典分组到键下的一个列表中。

最后,使用 Create Accumulator、Add Input、Merge Accumulators 和 Extract Output 方法将Combine.PerKey与自定义CombineFn使用。 在这种情况下,累加器类型也将是字典,合并累加器会将字典合并在一起。 由于字典只会按键合并,因此应该正确合并转换前后的相应字典。 如有必要,您可以在此之后从每个元素中删除键。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM