同一份行情数据,为什么换成 Parquet 后通常更省空间、也更适合分析?

CSV 与 Parquet:列式存储

约 9 分钟5 道自测更新于 2026-10-27

一句话记住CSV 适合交换和人工打开,Parquet 适合历史分析;列裁剪、谓词下推和类型保留带来的收益,必须用自己的数据实测。

01学完你能做到

解释 CSV 与 Parquet 的行式、列式差异;为历史行情选择合适的文件格式;理解列裁剪、谓词下推、行组和压缩,并识别小文件、类型丢失与频繁改单条记录的问题。

02这课解决什么问题

同一份行情数据,为什么换成 Parquet 后通常更省空间、也更适合分析?文件格式会影响存储成本、读取范围、类型是否保留,以及数据在不同工具之间传递时会不会变形。

03CSV 与列式存储

  • CSV:纯文本、按行组织、几乎所有工具都能打开。它没有内置 schema,数字和时间读回来可能是字符串;即使只取一列,通常也要扫描文本行。
  • 行式存储:一条记录的字段放在一起,适合按整行读取。
  • 列式存储:同一字段的值放在一起,适合只读少数列并进行批量统计。
  • Parquet:Apache 软件基金会的开源列式文件格式。文件由行组、列块和页组成,文件尾部元数据保存 schema 及部分统计信息。

同列数据类型相近、重复值较多时,可以使用字典编码、游程编码等编码方式,再结合 Snappy 或 Zstandard 等压缩。具体压缩效果取决于数据分布、排序和写入参数。

04两种常见优化

  • 列裁剪:查询只需要 code 和 close 时,只读取这两列。
  • 谓词下推:利用行组元数据中的最小值、最大值等统计,跳过不可能满足条件的数据块。例如某行组最大值低于查询下限,就无需读它。

历史行情常见分工是 Parquet 作为分析与归档层,CSV 作为人工查看、Excel 打开和简单交换层;实时传输通常使用消息格式或消息队列。

05一个小实验

下面的结果只是某次虚构数据实验的示意,文件大小和耗时会随数据分布、硬件、库版本、行组大小和压缩参数变化,不能当成通用承诺。

import numpy as np
import pandas as pd

rng = np.random.default_rng(0)
n = 100_000
df = pd.DataFrame({
    "ts": pd.Timestamp("2026-10-26 09:30") +
          pd.to_timedelta(np.arange(n), unit="min"),
    "code": np.resize(["000001.SZ", "600000.SH"], n),
    "close": rng.normal(10, 1, n).round(2),
    "volume": rng.integers(0, 100000, n),
})
df.to_csv("bars.csv", index=False)
df.to_parquet("bars.parquet", compression="zstd", index=False)

# Parquet 可只读取需要的列;CSV 的 usecols 也能减少解析结果,
# 但文本文件仍需扫描行内容。
small = pd.read_parquet("bars.parquet", columns=["code", "close"])
print(small.head())

CSV 读回时间通常需要显式解析;代码字段应按字符串读取,避免纯数字代码的前导零丢失。Parquet 能保存类型信息,但跨语言读取仍要检查 schema、时区和精度。

06常见误区

  1. 认为 Parquet 所有场景都更快:逐行追加、随机修改和频繁改单条记录并不是它的强项。
  2. 用 CSV 保存纯数字证券代码,导致 000001 被当成 1。
  3. 把 Parquet 当数据库:它是文件格式,本身不提供完整的事务、并发写控制和服务端查询能力。
  4. 写入前不排序,导致行组 min/max 范围过宽,谓词下推难以跳块。
  5. 产生大量极小 Parquet 文件,元数据、打开文件和对象存储请求开销反而上升。
  6. 只比较一次跑分,不用自己的数据和查询模式测量压缩、读取、内存和失败恢复。

07延伸阅读

08一分钟讲给别人

试着用自己的话讲一遍CSV 是按行存的文本,人好读、到处能开,但类型和体积都需要额外处理。Parquet 是按列存的文件,同一列更容易压缩,查询时只读需要的列,还能依靠行组统计跳过无关数据。历史行情常用 Parquet,人工导出仍常用 CSV。

想一想

5 道自测

先在心里答一遍,再展开对照。能说清理由,比答对数字更重要。

  1. 01列式存储为什么通常更适合只读取少数列?

  2. 02什么是列裁剪?

  3. 03什么是谓词下推?

  4. 04用 CSV 保存证券代码最常见的风险是什么?

  5. 05Parquet 是否等于数据库?

已看 0/5 题

练动手练习

任务:将一份行情表分别写成 CSV 和 Parquet,记录文件大小;分别读取全列和两列,比较耗时;检查证券代码、时间时区、数量单位和价格精度在读写前后是否一致。

完成这一课

完成这一课

读完讲义、看完自测答案,这一课就算学完了。

  • 读完讲义
  • 看完全部自测

本课为投资者教育内容,案例数字均为示意,不构成任何投资建议,也不承诺收益。规则和费率会变,实际操作前请以交易所、监管机构和产品的最新公告为准。