You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Apache Beam将Python列表对象写入标准JSON文件

解决方案

你当前输出的是JSON Lines格式(每行一个独立JSON对象),这是WriteToText的默认行为:每个输入元素会被单独转为字符串后逐行写入,不会自动添加数组包裹符和元素间的分隔逗号。要输出标准JSON数组,需要先将所有元素聚合为完整列表,再整体序列化为JSON格式后写入。

修改后的完整代码

import apache_beam as beam
import json

class BeamProcess:
    # 补充self参数,否则实例调用会报错
    def process_data(self):
        json_file_path = "gs://my_bucket/df_output/output.json"
        
        list_data = [
            {"id":"1", "name":"Cow", "type": "animal"},
            {"id":"2", "name":"Lion", "type": "animal"},
            {"id":"3", "name":"Peacock", "type": "bird"},
            {"id":"4", "name":"Giraffe", "type": "animal"}
        ]

        argv = [
                '--project=<my_project>',
                '--region=<region>',
                '--job_name=<custom_name>',
                '--temp_location=<temporary_location>',
                '--runner=DataflowRunner'
            ]

        p = beam.Pipeline(argv=argv)

        (
                p
                | 'Create' >> beam.Create(list_data)
                # 第一步:将所有元素聚合为一个全局列表
                | 'Aggregate to List' >> beam.combiners.ToList()
                # 第二步:将整个列表序列化为带缩进的标准JSON字符串
                | 'Serialize to JSON' >> beam.Map(lambda x: json.dumps(x, indent=4, ensure_ascii=False))
                | 'Write Output' >> beam.io.WriteToText(json_file_path, shard_name_template='')
        )
        p.run().wait_until_finish()

if __name__ == "__main__":
    beam_proc = BeamProcess()
    beam_proc.process_data()

注意事项

  • 该方案会将全量数据汇聚到单个Worker节点处理,仅适用于小数据集场景。如果数据规模较大,更推荐使用你当前得到的JSON Lines格式:该格式天然支持分布式读写,不需要加载全量文件到内存即可逐行解析,是大数据场景下的通用标准。
  • 若数据量极大又必须输出标准JSON数组,建议先写入JSON Lines格式,再单独运行后处理任务将其转换为数组格式,避免Beam流水线出现内存溢出问题。

内容的提问来源于stack exchange,提问作者Gopinath S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 20:39:02