数据格式对比:JSONL / Parquet / Arrow / ORC
一句话定位:选数据格式本质是在”解析成本 / 存储扫描 / 跨语言传输”之间取舍。面试常考”为什么把 JSONL 换成 Parquet/Arrow 吞吐能翻倍”。
1. 四种格式速览
| 格式 | 形态 | 解析成本 | 存储/扫描 | 跨语言 | 生态 |
|---|---|---|---|---|---|
| JSONL | 文本,每行一对象 | 高(逐行 JSON decode,CPU 瓶颈) | 无压缩/列裁剪 | 通用 | 日志、交换 |
| Parquet | 列式 + 压缩 | 低(二进制列读) | 友好(列裁剪+谓词下推+高压缩) | 好 | Hadoop 事实标准 |
| Arrow | 内存列式 | 极低(零拷贝) | 内存计算友好 | 极佳(C++/Python/Java 共享) | 内存计算/传输 |
| ORC | 列式 + 压缩 | 低 | 友好 | 好 | Hive 生态强绑定 |
- JSONL:可读但需逐行解析,无 schema/压缩弱,适合采集交换,查询慢。
- Parquet:列式 + 嵌套支持 + 高压缩,分析型存储首选。
- Arrow:内存中的列式格式,跨语言零拷贝共享(Spark↔Pandas、Ray Plasma),避免序列化。
- ORC:与 Parquet 类似,但和 Hive/Impala 集成更深。
2. 面试话术:JSONL → Parquet/Arrow 吞吐提升的三点
- 消除文本解析:免去逐行 JSON
decode(最贵的 CPU 环节); - 只读需要的列(列裁剪):不必把整行反序列化;
- 零拷贝 / 二进制列式:Arrow 在内存层免序列化,Parquet 在存储层免文本解析。
参考:Apache Parquet / Arrow / ORC 官方文档;Google Dremel 论文(Parquet 思想来源)