跳到主要内容

数据格式概述

本文档全面概述了大规模分析与存储系统中常用的数据格式,包括其典型应用场景、核心库及实现差异,核心聚焦实用参考,不涉及技术选型推荐。

格式汇总表

格式/类型用途/定位典型应用场景核心库/SDK
Parquet优化分析场景的列式存储格式大数据分析、ETL流水线、OLAP查询Apache Parquet(C++/Java/Python)、Arrow
Arrow面向快速计算的内存中列式格式内存中分析、引擎间零拷贝数据交换Apache Arrow(C++/Python/Java/Go)
Avro支持Schema进化的行式存储格式日志存储、流式流水线、数据序列化Apache Avro(C++/Java/Python)
HDF5存储大型数值型数据集的分层文件格式科学计算、大型多维数组存储HDF5(C/C++/Python)、h5py
NPYNumPy数组专用二进制格式机器学习实验、数值型数据存储NumPy(Python)
OCR扫描文档专用格式(文本提取场景)文档处理流水线、基于OCR的索引构建Tesseract、OpenCV、自定义SDK
Substrait关系代数查询计划序列化格式引擎间查询计划交换、查询联邦Substrait(基于Protobuf)、Arrow集成

实现差异与性能说明

Parquet

  • 列式存储支持高效压缩与谓词下推。
  • 实现方案
  • Apache Parquet C++(Arrow集成版)——高性能、零拷贝读取,广泛应用于Spark、Dask等分析引擎。
  • Apache Parquet Java——Hadoop/Spark生态的参考实现;JVM开销可能影响吞吐量。
  • 第三方库——例如Python的fastparquet,默认编解码器与性能表现有所不同。
  • 性能考量
  • 编码/压缩编解码器(Snappy、ZSTD、GZIP)对I/O和CPU占用影响显著。
  • 与Arrow集成支持零拷贝内存访问,降低分析流水线的CPU负载。
  • C++/Arrow版本支持多线程读取/解压缩,Java默认版本支持较弱。
  • 应用场景:优化用于批处理分析;库的选择对读取吞吐量和CPU消耗影响较大。

Arrow

  • 专注于内存中分析,常作为引擎间数据交换的中间格式。
  • C++核心实现性能最优;Python/Java绑定可能带来额外开销。

Avro

  • 行式存储,适用于写密集型流式工作负载。
  • Java实现最成熟;C++/Python绑定已存在,但部分Schema进化特性可能缺失。
  • 性能差异主要体现在序列化/反序列化速度上。

HDF5

  • 分层存储结构,支持丰富元数据,适配大型数值型数据集。
  • 核心为C库;Python的h5py是其封装库。
  • 性能表现极大依赖于分块策略和I/O模式。

NPY

  • 简单高效的NumPy数组二进制存储格式。
  • 无默认压缩;优化用于中小型数组。
  • 主要用于机器学习实验,不适合生产级批处理存储。

OCR

  • 应用场景专用格式;文本提取精度、速度及输出格式因库而异。
  • 无标准化存储方案;使用方式取决于具体文档处理流水线。

Substrait

  • 用于查询计划序列化的协议级格式,不用于原始数据存储。
  • 实现差异较小;核心关注点为兼容性和表达能力。

注意

注意:受生态系统限制,每种格式的可选实现方案相对固定。若有额外需求,可基于具体场景定制专属实现。