当前位置: 首页 > news >正文

Python将Parquet文件转换为JSONL格式文件

prompt:如何使用 Python 将 Parquet 文件转换为 JSONL 格式文件? 请提供完整的代码示例,包括使用 pandas 或 pyarrow 读取 Parquet 文件, 并将每行数据以 JSON 格式逐行写入 JSONL 文件的实现方式。 假设 Parquet 文件包含结构化数据,每行对应一个记录, 需要将每个记录转换为 JSON 对象并写入以换行符分隔的文本文件中。

将 Parquet 文件转换为 JSONL(JSON Lines)格式在数据处理中非常常见。根据文件大小和内存限制,通常有两种主流的实现方式:

使用 pandas:代码最简洁,适合能够一次性加载到内存中的中小型文件。
使用 pyarrow:支持分块(Batch)流式读取,内存占用极低,非常适合处理超大型 Parquet 文件。
以下是这两种方法的完整代码示例:

方法一:使用 pandas(最简单快捷)
pandas 提供了非常方便的to_json方法,只需设置orient='records'lines=True即可直接输出 JSONL 格式。
安装依赖:
pip install pandas pyarrow

代码示例:

import pandas as pd def parquet_to_jsonl_pandas(parquet_path, jsonl_path): """ 使用 pandas 将 Parquet 转换为 JSONL """ print(f"正在读取 Parquet 文件: {parquet_path}") # 读取整个 Parquet 文件到 DataFrame df = pd.read_parquet(parquet_path) print(f"正在写入 JSONL 文件: {jsonl_path}") # 将 DataFrame 写入 JSONL 文件 # orient='records' : 将每一行转换为一个独立的 JSON 对象 # lines=True : 每行写入一个 JSON 对象,以换行符分隔 # force_ascii=False: 确保中文字符等非 ASCII 字符正常显示,而不是转义为 \uXXXX # date_format='iso': 确保日期时间格式被正确转换为 ISO 8601 字符串 df.to_json(jsonl_path, orient='records', lines=True, force_ascii=False, date_format='iso') print("转换完成!") # 使用示例 # parquet_to_jsonl_pandas('input.parquet', 'output_pandas.jsonl')

方法二:使用 pyarrow(适合超大文件,内存友好)
如果Parquet文件非常大(例如几个 GB),使用pandas可能会导致内存溢出(OOM)。此时可以使用pyarrowiter_batches()方法,分块读取并逐行写入。

注意:pyarrow解析出的日期时间类型是 Python 的datetime对象,而 Python 内置的 json 库默认不支持序列化datetime,因此我们需要写一个简单的自定义编码器。

安装依赖:

pip install pyarrow

代码示例:

import pyarrow.parquet as pq import json from datetime import date, datetime # 自定义 JSON 编码器,用于处理 Parquet 中的日期/时间类型 class DateTimeEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, (datetime, date)): return obj.isoformat() return super().default(obj) def parquet_to_jsonl_pyarrow(parquet_path, jsonl_path): """ 使用 pyarrow 分块读取 Parquet 并转换为 JSONL,适合处理超大文件 """ print(f"正在打开 Parquet 文件: {parquet_path}") # 打开 Parquet 文件对象(此时并未将数据全部加载到内存) parquet_file = pq.ParquetFile(parquet_path) print(f"正在流式写入 JSONL 文件: {jsonl_path}") # 以追加或覆盖模式打开输出文本文件 with open(jsonl_path, 'w', encoding='utf-8') as f: # 逐块(Batch)读取数据,默认每块包含一定数量的行 for batch in parquet_file.iter_batches(): # 将当前数据块转换为 Python 字典列表 records = batch.to_pylist() # 遍历当前块的每一行记录 for record in records: # 将字典序列化为 JSON 字符串 # ensure_ascii=False 保证中文正常显示 # cls=DateTimeEncoder 处理时间字段 json_str = json.dumps(record, ensure_ascii=False, cls=DateTimeEncoder) # 写入文件并添加换行符 f.write(json_str + '\n') print("转换完成!") parquet_to_jsonl_pyarrow('input.parquet', 'output_pyarrow.jsonl')

总结与建议
首选 pandas:如果你的 Parquet 文件在几百 MB 以内,或者你的机器内存足够大,直接使用 pandas 代码最少,且底层经过高度优化,执行速度非常快。
备选 pyarrow:如果你的文件达到了 GB 级别,或者你在内存受限的环境(如 Docker 容器、云函数)中运行,请务必使用 pyarrow 的分块读取方案,它能将内存占用控制在极低的水平(仅占用当前 Batch 的内存)。

http://www.jsqmd.com/news/543048/

相关文章:

  • 多代同堂家庭外卖点单指南:宝妈实用备注技巧+全口味适配方案 - 速递信息
  • 刷力扣用for求了无数次数组和?别急,numeric来救急
  • 昆仑通态MCGS与西门子S7-200/200SMART PLC通讯及控制台达变频器技术解析
  • 推荐算法数学概念-向量-矩阵-损失函数-梯度下降
  • 帮老人远程点清淡外卖全攻略:地址设置+餐品选择+优惠指南 - 速递信息
  • 【数据结构与算法】第7篇:线性表(三):单链表的经典面试题(反转、找中间节点)
  • 个人开发者如何高效率APP上架安卓应用市场?软著、备案、资质、审核详解大全,一篇文章讲透流程规则!
  • 选吉他不踩坑:合板、单板、全单材质深度解析,新手看懂这篇就够
  • 42-西门子1200伺服控制5轴程序 程序采用1200系列PLC,项目实现以下功能: (1)
  • vLLM-v0.17.1实操手册:vLLM在Mac M2 Ultra上通过ROCm模拟运行
  • 如何快速回收微信立减金闲置资源?全攻略解析 - 团团收购物卡回收
  • 告别碎片化工具链:用Cube-Studio统一管理你的开源大模型(从ChatGLM到Llama3)
  • 目标检测损失函数进化史:从IoU到EIoU/SIoU/WIoU,YOLOv8性能提升完全指南
  • 【FreeRTOS实战入门】一、从CubeMX到第一个任务:手把手搭建FreeRTOS工程
  • 零成本搞数字化!免费低代码工具(斑斑AI vs 宜搭)测评
  • iOS18适配避坑指南:Xcode16编译报错全解析(含YYCache、ADClient修复方案)
  • 校园外卖配送范围查询及门口自取设置全攻略 - 速递信息
  • YOLOv12学术论文写作:使用LaTeX排版技术报告与实验图表
  • Llama-3.2V-11B-cot效果实测:同一张图不同提问下的CoT推理路径对比分析
  • 带娃宅家点外卖安全健康攻略:从商家筛选到餐品搭配全指南 - 速递信息
  • 如何通过解析技术获取百度网盘真实下载链接
  • 轻量系统构建:用tiny11builder打造高效Windows 11精简版
  • 构建可扩展的翻译引擎:Zotero PDF Translate插件架构深度解析
  • LED选型避坑指南:从电源指示灯到全彩显示,这些参数你考虑了吗?
  • Windows远程桌面多用户破解:RDP Wrapper终极配置指南
  • 计算机软件著作权登记证书、电子版权、软件著作权是什么关系
  • 深入TC397与TLF35584的SPI通信:从寄存器操作到汽车ECU低功耗状态管理实战
  • 【开源鸿蒙Flutter跨平台开发实战复盘】从零到一:GitCode口袋工具项目构建全记录
  • .mtl文件路径报错怎么办?Unity中修复白模问题的3种实战方案
  • vLLM-v0.17.1惊艳效果:束搜索+并行采样在长文本生成中的稳定性展示