我的几个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
)“
执行此操作的方式是什么?这是唯一可能吗?
答案 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()