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常见误区
- 认为 Parquet 所有场景都更快:逐行追加、随机修改和频繁改单条记录并不是它的强项。
- 用 CSV 保存纯数字证券代码,导致
000001被当成1。 - 把 Parquet 当数据库:它是文件格式,本身不提供完整的事务、并发写控制和服务端查询能力。
- 写入前不排序,导致行组 min/max 范围过宽,谓词下推难以跳块。
- 产生大量极小 Parquet 文件,元数据、打开文件和对象存储请求开销反而上升。
- 只比较一次跑分,不用自己的数据和查询模式测量压缩、读取、内存和失败恢复。
07延伸阅读
08一分钟讲给别人
试着用自己的话讲一遍CSV 是按行存的文本,人好读、到处能开,但类型和体积都需要额外处理。Parquet 是按列存的文件,同一列更容易压缩,查询时只读需要的列,还能依靠行组统计跳过无关数据。历史行情常用 Parquet,人工导出仍常用 CSV。
5 道自测
先在心里答一遍,再展开对照。能说清理由,比答对数字更重要。
01列式存储为什么通常更适合只读取少数列?
02什么是列裁剪?
03什么是谓词下推?
04用 CSV 保存证券代码最常见的风险是什么?
05Parquet 是否等于数据库?
已看 0/5 题
练动手练习
任务:将一份行情表分别写成 CSV 和 Parquet,记录文件大小;分别读取全列和两列,比较耗时;检查证券代码、时间时区、数量单位和价格精度在读写前后是否一致。
完成这一课
读完讲义、看完自测答案,这一课就算学完了。
- 读完讲义
- 看完全部自测
本课为投资者教育内容,案例数字均为示意,不构成任何投资建议,也不承诺收益。规则和费率会变,实际操作前请以交易所、监管机构和产品的最新公告为准。