Google cloud dataflow 基于python数据流中另一个PCollection的值筛选PCollection
我有两个p-Collection,如下所示 P1=['1','2','4','5','6','7','8'] P2=[('1',(2,1,2)),('5',(1,0,9)),('9',(1,2,3)),('10',(1,0,0)), ('1',(1,1,1))] 我想使用dataflow python编写合并器,这样我的P2就会像下面那样被过滤 结果=[('1',(2,1,2)),('5',(1,0,9)),('1',(1,1,1))]Google cloud dataflow 基于python数据流中另一个PCollection的值筛选PCollection,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,我有两个p-Collection,如下所示 P1=['1','2','4','5','6','7','8'] P2=[('1',(2,1,2)),('5',(1,0,9)),('9',(1,2,3)),('10',(1,0,0)), ('1',(1,1,1))] 我想使用dataflow python编写合并器,这样我的P2就会像下面那样被过滤 结果=[('1',(2,1,2)),('5',(1,0,9)),('1',(1,1,1))] 优化和快速的方法是什么?这是一种可能的解决方法: def
优化和快速的方法是什么?这是一种可能的解决方法:
def extract_keys(row):
for e in row[1]['p2']:
yield (row[0], e)
p = beam.Pipeline(options=beam.pipeline.StandardOptions())
p1 = p | 'p1' >> beam.Create([[str(i), 1] for i in range(8)])
p2 = p | 'p2' >> beam.Create([('1',(2,1,2)), ('5', (1,0,9)), ('9', (1,2,3)), ('10', (1,0,0)), ('1',(1,1,1))])
p3 = ({'p1': p1, 'p2': p2}
|'Group all keys' >> beam.CoGroupByKey()
| 'Filter' >> beam.Filter(lambda x: (len(x[1]['p2']) > 0 and len(x[1]['p1']) > 0))
| 'Extract keys' >> beam.FlatMap(lambda x: extract_keys(x))
| 'Save results' >> beam.io.WriteToText('result.csv'))
其结果是:
('1', (2, 1, 2))
('1', (1, 1, 1))
('5', (1, 0, 9))
这里发生了什么:首先请注意,我必须使用与您略有不同的输入。我的P1
就像[[1',1],[2',1]…]
。因此,我们可以在使用键作为合并参考将PCollections混合为一个的操作中使用它(请注意,在此步骤中,PCollections位于dict
中,因为这是CoGroupByKey
的预期输入)
完成后,我们只需过滤掉不匹配的密钥。应用extract_键
只是为了获得所需的预期输出
我建议您使用这些步骤,例如,您可以删除
p3
中的一些步骤,并查看每个操作的结果,以查看数据是如何转换的。此外,您还可以了解这些转换是如何工作的。到目前为止您做了哪些尝试?有没有一套你正在考虑的方法!