Parquet 常见于数据仓库、日志归档、机器学习数据集和云端分析任务。它看起来像一个可以“转成 CSV”的文件,内部却不是按一行接一行保存,而是把同一列的数据放在一起,再按 Row Group 分段组织。

这种列式结构很适合只读取少数几个字段,也便于压缩和统计;但用文本编辑器打开只会看到二进制内容。Parquet 在线查看器会在浏览器本地读取文件尾部元数据,展示 Schema、Row Group、压缩方式和字段统计,并按选择的字段与行范围预览数据。

Schema 里要看什么#

Parquet Schema 不只有字段名称。检查文件时,至少要区分下面几项:

  • 物理类型:例如 INT32INT64BYTE_ARRAY,表示底层怎样存储;
  • 逻辑类型:例如 UTF-8 字符串、日期、时间戳、Decimal,说明这些字节应怎样解释;
  • 重复规则:字段是必填、可选还是重复;
  • 嵌套路径:对象、数组和子字段可能组成多层结构;
  • Field ID:部分数据系统用它追踪字段演化,而不是只认字段名。

同一个 INT64 既可能是普通整数,也可能是毫秒或微秒时间戳。只看物理类型就导出,日期很容易变成一串看似异常的大数字。Decimal 还要同时看 precision 和 scale,否则金额的小数位会被解释错。

Row Group 为什么影响读取速度#

Row Group 是 Parquet 文件里的横向分段,每一段再按列保存。分析工具读取 countryamount 两列时,不必把其他几十列全部解码;如果查询条件能利用统计信息,还可能跳过明显不符合条件的 Row Group。

查看器会列出每个 Row Group 的行数、压缩前后体积、列块数量和编码方式。几个值得留意的信号是:

  • Row Group 数量很多但每组只有很少几行,可能造成额外元数据开销;
  • 单个 Row Group 过大,在内存有限的程序中读取会比较吃力;
  • 同一文件里混用多种压缩方式,可能来自多批次写入或合并流程;
  • 压缩后反而变化不大,字段本身可能接近随机数据,或者已经经过压缩。

Row Group 没有一个适用于所有数据的完美大小。它需要在顺序写入、并行读取、内存占用和条件跳过之间取平衡,所以这里更适合诊断,而不是看到某个数字就直接判定文件有问题。

字段统计不是完整的数据画像#

Parquet 列块可以记录最小值、最大值和空值数量。它们有助于快速判断日期范围、ID 边界和缺失程度,也常被查询引擎用来跳过无关数据。

但统计信息不是强制完整存在的。写入器可以不生成,也可能因为旧版本、嵌套字段或数据类型而只保留一部分。最小值和最大值也不能告诉你分布情况,更不能证明中间没有异常值。

因此看到“无统计”时,不等于整列为空;看到 min=1max=100,也不等于数值均匀分布。需要质量检查时,仍应读取样本或交给 DuckDB、Spark、Polars 等工具计算更完整的分布。

预览和导出时怎样避免结果失真#

先选择真正需要的顶层字段,再指定起始行和读取数量。页面单次预览最多 500 行,导出最多 10000 行,这样可以避免一个超大文件在浏览器里一次性展开。

CSV 适合扁平的二维数据。遇到数组、对象或二进制字段时,工具会把复杂值表示成文本;这种结果方便查看,却不一定适合无损往返。JSON 对嵌套结构更友好,BigInt 会保存为字符串,二进制会记录字节数和十六进制内容。

如果目标是把整份大型 Parquet 转成 CSV,浏览器不是最合适的地方。更可靠的方式是让 DuckDB 或 Polars 流式读取,并明确指定编码、时区和输出分片。这里只应导出用于核对、沟通或小范围分析的部分。

需要把小规模 CSV 或 JSON 继续整理成工作簿时,可以使用CSV / JSON 转 Excel 工具

文件打不开时先检查什么#

标准 Parquet 文件的开头和结尾都有 PAR1 标记。缺少标记通常说明扩展名写错、下载未完成,或者拿到的是目录式数据集中的其他文件。

另外还可能遇到:

  • 文件使用当前浏览器解码器尚不支持的压缩或编码;
  • Schema 含有少见的嵌套组合;
  • 文件尾部元数据损坏;
  • 文件来自分区数据集,单独一份并不能代表全部字段和数据;
  • 文件太大,设备读取和解码所需内存不足。

重要数据应先保留原文件,并计算 SHA-256 校验值。转换后的 CSV 只是一个派生版本,不能代替原 Parquet 的类型、嵌套结构和元数据。

总结#

查看 Parquet 的重点不只是“里面有哪些行”,还要弄清字段怎样解释、数据怎样分组、用了什么压缩,以及统计信息是否足以支持判断。

先看 Schema 和 Row Group,再选字段预览,最后按用途选择 CSV 或 JSON。这样得到的结果更容易核对,也能避免把时间戳当整数、把嵌套对象压成一段不可逆文本。