我正在尝试在本地计算机上运行python apache Beam脚本进行一些模拟。我已将“ DirectRunner”放入选项中。但是p.run()给我一个错误“ TypeError:Receiver()不带参数”
为什么会发生这种情况?我正在使用Spyder作为IDE。
编辑:这是一个代码示例,它采用以下形式的消息列表:
{ "Val_1": 1, "Val_2": 56, "date": "2019-04-01T15:00:04.340778" }
将其拆分并以
的形式放置(1, 56, 2019-04-01T15:00:04.340778)
然后将其保存到文本文件中。
p = beam.Pipeline('DirectRunner')
(p | 'ReadMessage' >> beam.io.textio.ReadFromTextWithFilename('input/inputs.json')
| 'Processing' >> beam.ParDo(Split())
| 'Write' >> beam.io.WriteToText('input/results.txt'))
p.run().wait_until_finish()
错误:
"TypeError: Receiver() takes no arguments"
答案 0 :(得分:1)
您无需将“ DirectRunner”指定为参数,如果您未指定任何运行器,即将其保留为空白,则默认使用DirectRunner运行。 这应该运行良好。
p = beam.Pipeline()
(p | 'ReadMessage' >> beam.io.textio.ReadFromTextWithFilename('input/inputs.json')
| 'Processing' >> beam.ParDo(Split())
| 'Write' >> beam.io.WriteToText('input/results.txt'))
result = p.run()
result.wait_until_finish()
if __name__ == "__main__":
run()
答案 1 :(得分:0)
假设您将管道指定为DirectRunner,就可以像执行任何常规文件一样执行Python Beam文件
p = beam.Pipeline('DirectRunner')
Apache Beam当前对Python 3.x的支持有限。如果尝试运行word count example,它将产生相同的错误。由于他们目前正在致力于对Python 3的全面支持,因此它将在将来修复。
当您想通过Google Cloud Platform部署Python Beam代码时,强烈建议切换到Python 2.7。
您可以跟踪问题here
但是,我不能说您的Split函数到底能做什么,所以我为您提供了一个最小的工作示例,以便您可以测试Beam的安装。
import apache_beam as beam
import ast
# The DoFn to perform on each element in the input PCollection.
class Split(beam.DoFn):
def process(self, element):
val = ast.literal_eval(element[1])
output ='('+','.join(map(str, val.values())) + ')'
return [output]
def run():
p = beam.Pipeline('DirectRunner')
(p | 'ReadMessage' >> beam.io.textio.ReadFromTextWithFilename('input/inputs.json')
| 'Processing' >> beam.ParDo(Split())
| 'Write' >> beam.io.WriteToText('input/results.txt'))
result = p.run()
result.wait_until_finish()
if __name__ == "__main__":
run()