为什么 Parquet 不适合直接用文本工具打开?
很多同学第一次接触 Parquet 时,会下意识地用记事本、VS Code、Sublime 等“文本工具”直接打开 .parquet 文件,结果看到一堆“乱码”。这并不是文件坏了,而是因为:Parquet 从设计上就不是给人类直接阅读的文本格式。
本文解释:为什么 Parquet 不适合直接用文本工具打开,以及更正确、更高效的查看方式。
1. Parquet 是二进制格式,不是“可读文本”
CSV/JSON/YAML 这类格式,本质是“字符序列”,文本工具能按编码(UTF-8/GBK)把字节映射成字符,所以能读。
而 Parquet 是一个二进制容器格式:
- 里面存的是结构化的二进制数据块
- 通过 offset(偏移量)+ 元数据来定位每一段内容
- 很多字节序列根本不是字符编码后的文本
所以文本编辑器看到的“乱码”是正常现象。
2. 列式存储导致它不是“按行换行”的结构
文本工具擅长的模型是:
- 一行 = 一条记录
- 用换行符分隔
- 用逗号/制表符等分隔字段
Parquet 采用列式存储:
- 同一列的数据在物理上更靠近
- 同一行的数据并不一定连续存放
因此你无法指望像在 CSV 里那样“滚动几屏就看到某一行数据”。即使把二进制当成字符强行展示,也很难对应到行/列。
3. Parquet 会对数据进行压缩与编码(读起来更不像文本)
Parquet 的核心优势是高压缩比 + 高读取性能,所以它通常会对列数据做:
- 压缩(如 Snappy、Gzip、ZSTD 等)
- 编码(如字典编码、RLE、位打包等)
这意味着:
- 你看到的很可能是压缩后的字节流
- 即使原始数据是字符串,存储时也可能被编码/压缩
文本工具对这些内容没有“解压/解码”的能力,自然无法还原成原始值。
4. Parquet 依赖元数据与索引结构,不能靠“肉眼扫字节”理解
Parquet 文件通常包含:
- schema(字段名、类型、是否可空、嵌套结构)
- row group(行组)
- column chunk(列块)
- page(页)
- statistics / min-max / null count(统计信息,视写入器而定)
这些结构靠元数据描述,必须用解析器才能正确读取。
没有解析器,你很难知道哪一段字节对应哪个字段、哪个行组、哪一页。
5. Parquet 常见嵌套结构与二进制列,更不适合文本查看
在真实业务数据中,Parquet 经常包含:
struct/list/map等嵌套类型- 二进制列(图片、音频、向量、embedding、序列化对象)
这些内容就算用工具解析,也需要以更合适的方式展示(例如 JSON 展开、媒体预览、或只展示占位符),文本工具更无从下手。
6. 大文件场景:文本打开不仅没用,还可能卡死
Parquet 往往用于分析型数据,文件可能很大。
文本编辑器对超大文件的体验通常是:
- 打开慢、渲染慢
- 搜索慢
- 容易占用大量内存
而 Parquet 的正确打开方式通常是“按需读取”:
- 只读 schema
- 抽样读取前 N 行
- 只读某几列
- 用条件过滤减少扫描
7. 那应该怎么“正确打开” Parquet?
以下是更推荐的方式:
- 用在线 Parquet Viewer:直接看 schema、预览行、搜索、SQL 过滤
- 你可以使用这个页面:/zh/parquet/viewer
- 用 DuckDB:本地或浏览器环境都能用 SQL 直接查询 Parquet
- 用 Spark / Trino / Presto:用于生产级大数据分析
- 用 Python pandas + pyarrow:适合开发调试与小规模处理
8. 实用建议:什么时候用 CSV,什么时候用 Parquet?
- 如果目标是“人类阅读/手工编辑/简单传输”:
- 优先 CSV / JSON
- 如果目标是“分析计算/压缩存储/按列读取/大规模数据”:
- 优先 Parquet
二者不是替代关系:很多团队会采用“Parquet 做存储 + CSV 做临时导出/共享”的组合。
小结
Parquet 不适合用文本工具直接打开,原因不是“它太高级”,而是它本来就不是文本格式:
- 二进制容器
- 列式存储
- 压缩与编码
- 元数据驱动的结构化布局
当你需要排查或浏览 Parquet 内容时,推荐使用 Parquet Viewer 或 SQL 引擎(如 DuckDB)去做“按需读取”。