Python中的Apache Beam:如何在另一个PCollection上重用完全相同的转换

时间:2018-10-26 17:08:44

标签: python google-cloud-dataflow apache-beam

我的几个PCollection(来自不同的来源)必须以相同的方式进行解码。

hits = (msgs | 'Parse' >> beam.Map(parse)
    | 'Decode' >> beam.Map(decode_hit))

然后:

dummy_hits = (dummy_msgs | 'Parse' >> beam.Map(parse)
    | 'Decode' >> beam.Map(decode_hit))

如果我可以重用转换,那将非常好,这要归功于我之前给它们指定的名称。我天真地尝试过:

dummy_hits = (dummy_msgs | 'Parse'
    | 'Decode')

但是我的管道无法建立。 (TypeError:需要一个PTransform对象,得到了Parse)。

我认为流水线模块的文档可能会指出:“如果需要应用相同的转换实例,那么正确的移位运算符   应该用于指定新名称(例如input | "label" >> my_tranform)“

执行此操作的方式是什么?这是唯一可能吗?

1 个答案:

答案 0 :(得分:1)

名称必须唯一,但是由于您的步骤顺序相同,因此您可能想创建一个这样的复合转换

https://beam.apache.org/get-started/wordcount-example/#creating-composite-transforms

这样做:

class ParseDecode(beam.PTransform):

  def expand(self, pcoll):
    return (pcoll
            | 'Parse' >> beam.Map(parse)
            | 'Decode' >> beam.Map(decode_hit))

这样您就可以这样做:

hits = (msgs | 'Parse msgs' >> ParseDecode()

然后是这个

dummy_hits = (dummy_msgs | 'Parse dummy msgs' >> ParseDecode()