如何通过python读取apache beam(数据流)中的JSON文件?

时间:2019-05-06 07:17:23

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

我正在尝试通过python中的Apache Beam读取JSON文件,并在其上应用一些数据质量规则。 目前,我正在使用beam.io.ReadFromText读取每条json行,并使用一些函数来修改数据。 读取和修改JSON数据的更好方法是什么?

(p
  | 'Getdata' >> beam.io.ReadFromText(input)
  | 'filter_name' >> beam.FlatMap(lambda line: dq_name(line))
  | 'filter_phone' >> beam.FlatMap(lambda line: dq_phone(line))
  | 'filter_zip' >> beam.FlatMap(lambda line: dq_zip(line))
  | 'filter_address' >> beam.FlatMap(lambda line: dq_city(line))
  | 'filter_website' >> beam.FlatMap(lambda line: dq_website(line))
  | 'write' >> beam.io.WriteToText(output_prefix)  )

注意:我对此并不陌生,如果我目前的方法看起来太愚蠢,对不起。

2 个答案:

答案 0 :(得分:0)

您从错误的方向接近Apache Beam(数据流)。

您正在尝试读取一行,然后一次将变换应用于该行。

相反,您需要将Beam视为并行处理器。您将阅读所有ReadFromText()行,然后将转换并行应用于每一行。

查看功能beam.ParDo()。这将允许您创建一个可以处理JSON文件每一行的类。这样,您的代码将具有主要步骤,例如ReadFromText()ParDo(MyJsonProcessor())WriteToText()

请记住,您的JSON将需要为换行符分隔的JSON。 http://ndjson.org/

答案 1 :(得分:0)

我认为您的管道还可以。它将并行运行而没有任何问题。仅供参考,如果您仅将FlatMap用于过滤元素,则也可以使用Filter