Python将Parquet文件转换为JSONL格式文件
prompt:如何使用 Python 将 Parquet 文件转换为 JSONL 格式文件 请提供完整的代码示例包括使用 pandas 或 pyarrow 读取 Parquet 文件 并将每行数据以 JSON 格式逐行写入 JSONL 文件的实现方式。 假设 Parquet 文件包含结构化数据每行对应一个记录 需要将每个记录转换为 JSON 对象并写入以换行符分隔的文本文件中。将 Parquet 文件转换为 JSONLJSON Lines格式在数据处理中非常常见。根据文件大小和内存限制通常有两种主流的实现方式使用 pandas代码最简洁适合能够一次性加载到内存中的中小型文件。使用 pyarrow支持分块Batch流式读取内存占用极低非常适合处理超大型 Parquet 文件。以下是这两种方法的完整代码示例方法一使用 pandas最简单快捷pandas 提供了非常方便的to_json方法只需设置orientrecords和linesTrue即可直接输出 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 文件 # orientrecords : 将每一行转换为一个独立的 JSON 对象 # linesTrue : 每行写入一个 JSON 对象以换行符分隔 # force_asciiFalse: 确保中文字符等非 ASCII 字符正常显示而不是转义为 \uXXXX # date_formatiso: 确保日期时间格式被正确转换为 ISO 8601 字符串 df.to_json(jsonl_path, orientrecords, linesTrue, force_asciiFalse, date_formatiso) print(转换完成) # 使用示例 # parquet_to_jsonl_pandas(input.parquet, output_pandas.jsonl)方法二使用 pyarrow适合超大文件内存友好如果Parquet文件非常大例如几个 GB使用pandas可能会导致内存溢出OOM。此时可以使用pyarrow的iter_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, encodingutf-8) as f: # 逐块Batch读取数据默认每块包含一定数量的行 for batch in parquet_file.iter_batches(): # 将当前数据块转换为 Python 字典列表 records batch.to_pylist() # 遍历当前块的每一行记录 for record in records: # 将字典序列化为 JSON 字符串 # ensure_asciiFalse 保证中文正常显示 # clsDateTimeEncoder 处理时间字段 json_str json.dumps(record, ensure_asciiFalse, clsDateTimeEncoder) # 写入文件并添加换行符 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.coloradmin.cn/o/2453847.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!