在此处(https://beam.apache.org/documentation/programming-guide/#additional-outputs)的4.5.2文档中,产生了pvalue.TaggedOutput()
。
pvalue
似乎很难导入,我已经从apache文档中复制了导入行,并且我使用了{{1}中的--save_main_session
选项和save_main_session=True
}}和def run()
,然后再启动管道。所有导入均适用于所有功能,所有类均适用于所有功能。但不是pipeline_options.view_as(SetupOptions).save_main_session = save_main_session
。我还尝试了所有可能的组合以及将它们排除在外的所有方法。 pvalue
始终是未知的。
我从此处获取食谱中的所有代码:https://github.com/apache/beam/blob/master/sdks/python/apache_beam/examples/cookbook/multiple_output_pardo.py
不过,没有pvalue。
pvalue
仅当我使用Dataflowrunner时才生成此错误,而当我使用Directrunner时则不生成。
我的DoFn示例
NameError: name 'pvalue' is not defined [while running 'generatedPtransform-1725']
run()的示例
class Splitter(beam.DoFn):
TAG1 = 'kleintje'
TAG2 = 'grootje'
def process(self, element):
splittertid = element.get('id')
if splittertid < 100:
yield pvalue.TaggedOutput(self.TAG1, element)
else:
yield pvalue.TaggedOutput(self.TAG2, element)
**我的进口商品**
def run(argv=None, save_main_session=True):
sources = [
json.loads('{"id":72234,"value":1'),
json.loads('{"id":23,"value":2}')
]
parser = argparse.ArgumentParser()
known_args, pipeline_args = parser.parse_known_args(argv)
pipeline_options = PipelineOptions(pipeline_args)
pipeline_options.view_as(SetupOptions).save_main_session = save_main_session
with beam.Pipeline(options=pipeline_options) as p:
| beam.Create(sources)
| beam.ParDo(Splitter()).with_outputs(Splitter.TAG1,Splitter.TAG2,main=Splitter.TAG1)
答案 0 :(得分:0)
由于使用Apache Beam时应在类和函数中声明依赖项,因此应尝试在类Splitter中导入 pvalue 。
您的代码应该是这样
class Splitter(beam.DoFn):
from apache_beam import pvalue
TAG1 = 'kleintje'
TAG2 = 'grootje'
def process(self, element):
splittertid = element.get('id')
if splittertid < 100:
yield pvalue.TaggedOutput(self.TAG1, element)
else:
yield pvalue.TaggedOutput(self.TAG2, element)
由于代码在本地运行,因此您可以将from apache_beam import pvalue
与Directrunner一起正常使用;但是,在使用Dataflowrunner时,代码应遵循正确处理dependencies的结构。
答案 1 :(得分:0)
以某种方式弄乱了对Dataflowrunner的依赖。通过加载一组错误的依赖项,然后再次将其删除,事情突然开始起作用。
毕竟像from apache_beam import pvalue
一样导入。
也许从这里学到的教训是,可能有损坏的依赖项,您可以通过安装和卸载较旧或错误的apache_beam
软件包而触发的强制重新安装来解决这些依赖项。