Python无需Pandas写入Parquet文件:ETL中JSON转Parquet方法咨询
当然有办法!你完全可以跳过Pandas DataFrame这一步,直接用PyArrow的原生功能完成JSON到Parquet的转换——既省了多余的内存开销,又彻底摆脱了对Pandas的依赖,非常适合ETL流水线的高效处理需求。
下面给你两种实用的实现方式:
1. 基础版:直接读取JSON并写入Parquet
PyArrow自带的pyarrow.json.read_json()方法可以直接把JSON文件、内存中的JSON字符串数组甚至文件对象转换成PyArrow Table,之后用pyarrow.parquet.write_table()就能直接输出Parquet文件,全程和Pandas无关。
举个简单的代码示例:
import pyarrow as pa import pyarrow.json as pajson import pyarrow.parquet as papq # 从本地JSON文件读取成PyArrow Table json_table = pajson.read_json("your_input.json") # 直接写入Parquet文件 papq.write_table(json_table, "your_output.parquet")
如果你的JSON数据是存在内存里的字符串列表,也能直接处理:
# 内存中的JSON字符串示例 json_strings = [ '{"user_id": 101, "username": "milan_c", "signup_date": "2023-01-15"}', '{"user_id": 102, "username": "data_nerd", "signup_date": "2023-02-20"}' ] # 从字符串数组生成PyArrow Table json_table = pajson.read_json(pa.array(json_strings)) papq.write_table(json_table, "memory_to_parquet.parquet")
2. 进阶版:自定义Schema控制转换逻辑
如果你的JSON数据结构复杂(比如存在可选字段、嵌套结构),或者需要严格控制输出Parquet的Schema,可以提前定义PyArrow Schema,让JSON读取时按照指定规则解析,避免自动推断可能带来的类型错误:
import pyarrow as pa import pyarrow.json as pajson import pyarrow.parquet as papq # 自定义Schema,明确每个字段的类型 custom_schema = pa.schema([ ("user_id", pa.int64()), ("username", pa.string()), ("signup_date", pa.date32()), ("is_premium", pa.bool_()) ]) # 按照自定义Schema读取JSON json_table = pajson.read_json("complex_input.json", schema=custom_schema) # 写入Parquet时还可以配置压缩、分区等参数 papq.write_table( json_table, "schema_controlled_output.parquet", compression="snappy", # 启用snappy压缩 write_statistics=True # 写入统计信息,提升后续查询性能 )
这种方式的优势很明显:
- 完全移除Pandas依赖,简化项目的依赖管理
- 基于PyArrow的列式存储特性,内存效率更高,处理大数据量时比Pandas更高效
- 原生支持多种输入源,适配不同的ETL场景
内容的提问来源于stack exchange,提问作者Milan Cermak
相关产品推荐
相关产品推荐

