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 的内存)。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐