我正在尝试通过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) )
注意:我对此并不陌生,如果我目前的方法看起来太愚蠢,对不起。
答案 0 :(得分:0)
您从错误的方向接近Apache Beam(数据流)。
您正在尝试读取一行,然后一次将变换应用于该行。
相反,您需要将Beam视为并行处理器。您将阅读所有ReadFromText()
行,然后将转换并行应用于每一行。
查看功能beam.ParDo()
。这将允许您创建一个可以处理JSON文件每一行的类。这样,您的代码将具有主要步骤,例如ReadFromText()
,ParDo(MyJsonProcessor())
,WriteToText()
。
请记住,您的JSON将需要为换行符分隔的JSON。 http://ndjson.org/
答案 1 :(得分:0)
我认为您的管道还可以。它将并行运行而没有任何问题。仅供参考,如果您仅将FlatMap
用于过滤元素,则也可以使用Filter
。