NameError:名称“ pvalue”未定义

时间:2019-12-02 12:01:07

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

在此处(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)

2 个答案:

答案 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软件包而触发的强制重新安装来解决这些依赖项。