写点什么

探索 Parquet 格式:实现高效数据存储与优化查询性能

作者:星环科技
  • 2025-08-11
    上海
  • 本文字数:4658 字

    阅读完需:约 15 分钟

介绍


随着大模型 AI 技术的发展,全球数据量呈指数增长,尤其是非结构化数据的增加挑战了传统关系型数据库的有效性。传统存储方式不仅成本高,还影响数据处理效率。企业面临的主要矛盾在于:尽管采用了结构化存储方案,但复杂的 ETL 流程割裂了数据工程与分析,增加了协作成本并限制了数据价值的实时释放。


在此背景下,Parquet 作为一种革命性的列式存储格式正重塑数据生态。该开源格式通过创新的列式存储架构,实现了三个维度的技术突破:1)基于列式存储的高效压缩算法,较传统行式存储可节省 50%以上的存储空间;2)支持复杂嵌套数据结构的 Schema 演化能力,完美适配 JSON、Avro 等现代数据格式;3)跨平台兼容性设计,原生支持 Java、Python、C++等主流编程语言,并与 Spark 等大数据计算框架深度集成。


星环科技 TDH 社区版提供了免费使用的解决方案,不仅全面支持 Parquet 格式,还兼容其他常用的数据格式如 ORC 和 Avro,满足多样化需求。通过 TDH 社区版对这些格式的支持,用户能够更高效地处理海量数据,提升查询性能,降低存储成本,为业务创新提供强大支持。




行式存储 vs 列式存储


在深入探讨 Parquet 的技术优势之前,我们需要先理解数据存储领域两个根本性的范式差异——行式存储与列式存储的内在逻辑。



(1)行式存储行式存储将数据按行存储在磁盘上,即将同一行的所有字段值存储在一起。适用于 OLTP(在线事务处理)场景,如数据库系统,其中通常需要快速地执行插入、更新和删除操作。


行式存储的优点: 快速定位整行数据:行式存储能够快速定位到某一行的数据。例如,当查询 Order ID=100 的数据时,只需从存储中直接读取这一行,所有字段都能一次性高效返回。事务操作支持好:行式存储非常适合高频的增删改操作,例如修改 Order ID=100 这一行的 Price 值。这种操作只需要定位到该行并进行更新,整体效率非常高。


(2)列式存储列式存储将数据按列存储在磁盘上,即将同一列的所有数值存储在一起。适用于 OLAP(在线分析处理)场景,如数据仓库和大数据分析平台,其中通常需要执行复杂的查询和聚合操作。查询时只需读取所需的列,因此在分析性能上通常比行式存储更高效,特别是当查询只涉及部分列时。


列式存储的优点:


按列查询性能高:在数据分析场景中,查询操作往往只涉及少数列,例如筛选 Price 接近 200 的数据。在列式存储中,只需读取 Price 列即可,这显著减少了 I/O 操作和内存占用,提高了查询效率。


压缩效果好:由于同一列的数据类型相同且分布相似,列式存储能够实现高效压缩。例如,Quantity 列的值有一定规律性,这样的数据在列式存储中可以被压缩得非常紧凑,从而节省存储空间并加速处理。




Parquet 文件格式特点


1. 列式存储 Parquet 将数据按列存储,而不是按行存储。这意味着每个列的数据被单独存储,而不是整行的数据。这种存储方式有几个优势:数据压缩效率高:相同类型的数据通常会有更高的重复性,这使得压缩算法在列式存储下更为有效,压缩率可较行式存储提升 3-5 倍。查询效率高:针对典型分析场景中"只读取部分字段"的查询特性,列式存储天然支持列裁剪,可直接跳过无关列的读取过程,有效降低 I/O 负载。


2. 分区和 row groups


Parquet 文件被分割为多个 row groups(行组),每个 row group 包含部分行的数据。



每个 row group 可以独立于其他 row groups 进行压缩和存储。这种分割方式提供了以下优势:


更高的并行性:分布式处理框架如 Spark 可以并行读取和处理不同的 row groups,从而加速数据处理任务。


谓词下推:Parquet 存储了每个列块的元数据,包括最小值和最大值,查询引擎可以利用这些信息来跳过不满足条件的数据块,减少 I/O 操作,加快查询执行速度。


3. 模式演进和兼容性 Parquet 文件在物理存储中完整保留数据模式(Schema)定义,这种设计赋予其强大的模式演化能力。当业务需求变更导致数据结构扩展时,Parquet 支持向现有数据集添加新列,而无需重构原有数据。更进一步,它允许在不同版本间实现兼容性读写:新增列可设置默认值或标记为可选字段,历史查询仍能正常执行。这种灵活性在数据湖架构中尤为重要,既避免了全量数据迁移的高昂成本,又能确保新旧系统间的平滑过渡,使数据资产具备持续演进的生命力。


4. 跨平台和生态系统支持


Parquet 是一个开放的文件格式,其跨语言 SDK 支持 Java、Python、C++等主流开发语言,并深度集成到 Inceptor。在星环 TDH 平台中,Parquet 作为开放的列式存储格式,通过深度集成支持外部数据的高效接入与分析,并与平台的多模型存储引擎协同,辅助实现从采集到分析的数据流转。这种开放生态不仅降低了异构系统间的集成成本,更构建起统一的数据交换层,使结构化与半结构化数据能够在不同处理引擎间自由流动。




Parquet 架构解析



技术架构 Parquet 的架构如上图所示,主要包含以下 5 个主要模块:


  1. parquet-format:定义了所有格式规范,以及由 Thrift 序列化的元数据信息等。

  2. parquet-mr:包括多个实现了读写 Parquet 文件的功能模块,并且提供一些和其它组件适配的工具,例如 Hadoop Input/Output Formats、Pig loaders、Hive Serde 等。

  3. parquet-cpp:用于读写 Parquet 文件的 C++ 库。

  4. parquet-rs:用于读写 Parquet 文件的 Rust 库。

  5. parquet-compatibility:包含验证不同语言之间读写 Parquet 文件的兼容性测试等。




数据模型


Parquet 是一种支持嵌套的数据模型,和 Protocol Buffers 的数据模型类似,它的 schema 就是一个嵌套 message。每个 schema 包含多个字段,每一个字段又可以包含多个字段,每一个字段有三个属性:repetition、type 和 name,其中 repetiton 可以是以下三种:required(出现 1 次),repeated(出现 0 次或多次),optional(出现 0 次或 1 次)。每一个字段的数据类型可以分成两种:group(复杂类型)和 primitive(基本类型)。 Parquet Schema 示意图如下。



以下面这个 schema 为例(同上图)介绍 Parquet 的数据模型 message AddressBook {


required string owner;repeated string ownerPhoneNumbers;repeated group contacts {required string name;optional string phoneNumber;}}
复制代码


在这个 schema 中,每条记录代表一条轨迹。每条记录中有且仅有一个 owner,每个 owner 可以对应 0 个或多个 ownerPhoneNumbers 和 contacts 。每个 contacts 必须包含一个 name,phoneNumber 字段则为可选字段。在 schema 的顶层是 message,它可以包含多个字段。每个字段具有三个属性:重复性(repetition)、类型(type)和名字(name)。字段的重复性包含三种:


  1. required:有且只有一次

  2. optional:0 次或 1 次

  3. repeated:0 次或多次


字段的类型包括:


  1. 基础数据类型(物理上只存储基础数据类型):BOOLEAN、INT32、INT64、INT96、FLOAT、DOUBLE、BYTE_ARRAY、FIXED_LEN_BYTE_ARRAY

  2. 逻辑数据类型(指导如何转换成基础数据类型进行存储):


  1. 字符串类型:STRING、ENUM、UUID

  2. 数字类型:有符号整数,无符号整数 INT(8/16/32/64, true/false)

  3. 十进制:DECIMAL

  4. 时间类型:DATE、TIME、TIMESTAMP

  5. 嵌入类型:JSON、BSON、VARIANT

  6. 嵌套类型:LIST(需要三级嵌套),MAP(需要三级嵌套)

  7. 空值




Parquet 编码与压缩策略编码编码是将数据转换为更紧凑的格式,以减少存储空间或提高计算效率。Parquet 使用了几种常见的编码方式来对数据进行编码,这些编码方式有助于在存储时减少数据的冗余,提高读取性能。


  1. PLAIN 编码:PLAIN 编码是 Parquet 中最基础的编码方式,它将原始数据直接存储,没有进行任何压缩或变换。该编码方式简单且高效,适用于数据分布均匀的场景,但可能会占用较多存储空间。PLAIN 编码通常用于存储不需要特别优化的字段数据,如简单的整数或字符串。

  2. DICTIONARY 编码:DICTIONARY 编码是一种通过使用字典(映射表)将数据中的重复值替换为字典索引的编码方式。该编码方法适用于有大量重复值的数据类型,比如类别型数据。在 Parquet 中,数据被分成多个区块,每个区块都会为该区块内的数据生成一个字典。存储时,数据中的重复项会被替换为字典的索引,进而节省存储空间。这种方法能够显著降低存储空间,但需要为每个数据块生成字典,可能会增加读取时的解码开销。

  3. RLE(Run-Length Encoding)编码:RLE(Run-Length Encoding)编码是通过记录连续相同值的数量来压缩数据的一种方式。在数据中,若出现连续相同的值,RLE 会记录这些值出现的次数,从而将重复的数据压缩成更小的表示形式。RLE 编码特别适用于数据中存在大量连续相同值的情况。例如,如果一个字段连续出现 100 个相同的数字,那么 RLE 会将其压缩为“值+出现次数”的形式。

  4. 位打包(Bit-Packing)编码:位打包(Bit-Packing)是一种将多个小数据类型压缩为更小比特数表示的编码方式。该方法通过打包多个值来提高存储效率,通常用于存储较小的数据类型,如整数、布尔值等。Bit-Packing 可以将每个字段中的数据值压缩为最小的比特位数,从而减少存储空间。

  5. DELTA 编码:DELTA 编码是一种记录数据与其前一个值差异的编码方式。这种方法非常适合存储数值范围比较小且增减变化不大的数据。例如,对于一个增长规律较为平稳的数字序列,DELTA 编码将存储每个数值与前一个数值的差异,而不是存储完整的数值。这样可以显著降低存储空间,特别是对于时间序列数据或连续数据。




压缩


压缩是将数据进一步减少存储空间的技术。Parquet 支持多种压缩算法,可以在不牺牲数据质量的情况下,进一步压缩数据以节省存储空间。常见的压缩算法包括 Snappy、GZIP、LZO、Brotli 等。


  1. Snappy 压缩:Snappy 是 Google 开发的一种压缩算法,具有非常快的压缩和解压缩速度。它的压缩比虽然不如 GZIP,但由于其高效的速度,特别适合大数据处理场景中实时数据处理的需求。Snappy 通常是 Parquet 默认的压缩算法,尤其适用于对速度要求较高的场景。

  2. GZIP 压缩:GZIP 是一种较为常见的压缩算法,相较于 Snappy,它的压缩比更高,但速度较慢。GZIP 压缩适用于对存储空间有较高要求的场景,尤其是当存储成本较高或数据量特别大的时候。GZIP 的高压缩比使得它能有效减少存储需求,但解压缩的速度可能成为瓶颈。

  3. LZO 压缩:LZO 是一种快速的压缩算法,类似于 Snappy,适用于需要快速压缩和解压缩的场景。LZO 的压缩比一般不如 GZIP,但它的速度非常快,适合于大数据分析中对压缩速度要求较高的应用场景。

  4. Brotli 压缩:Brotli 是由 Google 开发的一种压缩算法,常用于 Web 数据传输中的压缩。Brotli 的压缩比比 GZIP 更高,并且其解压速度也较为高效。近年来,Brotli 也开始在 Parquet 中被使用,尤其适用于对存储需求有较高要求的场景。

  5. Zstandard(ZSTD)压缩:Zstandard(ZSTD)是一种新兴的压缩算法,旨在提供比 GZIP 更高的压缩比和更快的解压速度。ZSTD 兼具了较高的压缩效率和较低的延迟,非常适合需要平衡存储与速度的应用场景。


#创建 Parquet 表


CREATE TABLE users_parquet (     id INT,     name STRING,     age INT ) USING parquet LOCATION '/path/to/parquet/table';   #插入数据到Parquet表 INSERT INTO users_parquet VALUES (1, 'Alice', 29), (2, 'Bob', 31), (3, 'Charlie', 25);   #查询Parquet表 SELECT * FROM users_parquet; SELECT * FROM users_parquet WHERE age > 30;   #创建分区表 CREATE TABLE users_partitioned (     id INT,     name STRING,     age INT ) PARTITIONED BY (age) USING parquet LOCATION '/path/to/partitioned/table';
复制代码


总结


Parquet 格式凭借其高效的压缩算法、强大的模式演化能力以及广泛的跨平台支持,已经成为现代数据存储与处理的重要工具。星环科技 TDH 社区版全面免费支持包括 Parquet 在内的多种先进数据格式,助力用户实现更高效的海量数据分析与处理。

用户头像

星环科技

关注

还未添加个人签名 2020-10-22 加入

构建明日数据世界

评论

发布
暂无评论
探索Parquet格式:实现高效数据存储与优化查询性能_人工智能_星环科技_InfoQ写作社区