什么是 Parquet?列式存储、模式和用例
Scrapeless Scraping API 以 JSON 或 CSV 格式返回结构化网页数据,分析管道可以验证并将其转换为 Apache Parquet,以便进行重复的列式查询。
TL;DR
- Apache Parquet 是一种面向列的文件格式。 同一列中的值被存储在一个旨在分析阅读的二进制布局中。
- Parquet 包含模式和统计信息。 读者可以理解物理类型和逻辑类型,并可以跳过无关的列、行组或页面。
- 列存储提高了压缩效率。 相似的相邻值通常以高效的方式编码,从而减少存储和 I/O 需求,适用于扫描密集型工作负载。
- Parquet是一种文件格式,而不是一个完整的表管理系统。 事务、快照、分区元数据和多文件演变需要一个目录、约定或表层。
- Parquet 适用于一次写入,多次读取的分析。 对于手动编辑、单条记录更新、小文件或低延迟点查找,这样做不太方便。
什么是 Apache Parquet?
Apache Parquet 是一种开源的、面向列的数据文件格式,用于高效的存储和检索。Parquet 不是将一个记录的每个字段一起写入,而是根据列在受限的行组中组织值。分析引擎可以仅读取查询所需的列,而不是扫描每个记录中的每个字段。
抱歉,您似乎没有提供需要翻译的具体文本。请提供要翻译的内容,我会为您翻译。 Apache Parquet 文档 链接格式规范、概念、文件格式详细信息和实施资源。该格式在数据处理引擎和语言中得到了支持,使其成为数据湖、数据仓库、特征管道和归档分析数据集的常见存储边界。
Parquet 是二进制格式。它并不打算在文本编辑器中打开和编辑。读取库使用存储在文件中的元数据来定位列块、解码页面、应用压缩编解码器,并重构行或列向量。
为什么列式存储很重要
考虑一个包含客户 ID、国家、类别、描述、价格和事件时间的数据集。一个计算各国家平均价格的查询仅需要三列。在行导向文本文件中,引擎仍会读取描述和其他未使用的字段。在 Parquet 中,引擎可以选择必要的列块。
列值也往往与其邻居相似。一个国家列可能会重复一小组代码,一个布尔列的基数非常低,而排序的时间戳可能具有小的增量。编码和压缩可以更有效地利用这些模式,而不是将无关的字段类型交替排列在每一行中。
列存储并不会让每个操作更快。重建一个完整的单个记录可能会涉及许多列块。更新一个记录通常意味着重写文件数据,而不是就地更改一行。Parquet 更倾向于扫描、聚合、过滤和选择性投影,而不是事务性行更新。
Parquet文件是如何组织的
一个 Parquet 文件包含通过多个层组织的元数据和编码数据:
- 文件元数据。 页脚记录模式、行组、列位置、编码、压缩信息以及可选的键值元数据。
- 行组。 行组是行的水平分区。该行范围内的每列都存储为列块。
- 列块。 一个块包含一行组中一列的值,并分为多个页面。
- 页面。 页是应用和读取编码、压缩和一些统计信息的单元。
- 页脚。 文件末尾的元数据使读者能够在选择要提取的数据范围之前发现布局。
详细结构和编码存在于 Apache Parquet格式规范库实现可能支持不同的子集或可选功能,因此管道应该测试其写入者和读取者之间的兼容性。
物理类型和逻辑类型
Parquet 定义了控制低级存储的物理类型,包括整数、浮点值、字节数组和固定长度字节数组。逻辑类型注释添加了领域意义,例如字符串、十进制、日期、时间、时间戳、UUID、列表、映射和整数宽度。
一个十进制值说明了为什么区分很重要。它的物理字节可能存储为整数或字节数组,而逻辑注释提供精度和范围。读者需要这两个层面才能正确重建预期的值。
模式设计应保留业务语义。时间戳需要一个记录的时区解释。小数精度必须覆盖预期值。看起来像数字的标识符可能应属于字符串类型。编写者不应根据小样本推断窄类型,因为后续文件可能包含更大的值。
嵌套数据在Parquet中
Parquet 可以表示嵌套记录、列表和映射,而不是强迫每个数据集都成为扁平表。它使用定义和重复级别来编码嵌套字段是否存在,以及在重建的结构中重复值属于何处。
此功能使 Parquet 成为验证的 JSON 记录的自然目标,这些记录包含数组或子对象。转换仍然需要一个稳定的模式。如果一条记录将一个字段存储为字符串而另一条记录在同名下存储一个对象,则写入者必须在生成可靠的数据集之前解决该冲突。
嵌套列可以减少与将每个子项展平到一行相比的重复父数据。当引擎以不同的方式暴露嵌套结构时,它们也可能使查询和互操作性变得复杂。测试管道中使用的确切列表和映射形状。
Parquet 与 CSV 和 JSON
| 维度 | parquet | CSV | JSON |
|---|---|---|---|
| 布局 | 二进制列式 | 文本行和字段 | 文本对象、数组和值 |
| 架构 | 嵌入的物理和逻辑类型 | 外部或推断的 | 基本值类型;领域架构是外部的 |
| 人类可读性 | 需要工具 | 容易以文本或表格形式检查 | 容易检查适度的文档 |
| 嵌套数据 | 支持 | 需要扁平化或相关文件 | 直接支持 |
| 选择性读取 | 列和行组修剪 | 通常扫描记录 | 通常扫描文档或流 |
| 更新 | 文件通常被重写或替换 | 可能附加,安全更新麻烦 | 文档或流替换很常见 |
| 最佳边界 | 分析存储和交换 | 平面数据交接 | API、事件和应用处理 |
压缩、编码和统计
parquet将编码与压缩分开。编码在压缩编解码器处理页面字节之前有效地表示值。实现可以选择字典编码、游程长度技术、位打包、增量编码或根据类型和数据的简单表示。
元数据统计可以包括最小值和最大值、空值计数和其他索引。查询引擎可以利用这些信息跳过无法满足过滤器的行组。这就是谓词下推或在存储层的修剪。当数据组织和统计与查询谓词对齐时,可以减少I/O。
统计数据不能替代访问控制,可能向可以读取文件元数据的任何人揭示值范围或计数。敏感数据集需要存储权限、加密控制和对象及目录层的治理。
分区、文件和小文件问题
数据集经常将Parquet文件放置在按经常过滤的值(如日期或区域)分区的目录中。查询引擎可以在打开文件元数据之前跳过整个路径。分区字段应具有受控基数;为每个用户或请求创建一个目录可能会产生无法管理的小分区数量。
许多小文件增加了规划、列出、连接和元数据的开销。它们还会减少每个文件中可用于有效压缩的数据量。管道通常将小输出压缩成适合其查询引擎和对象存储的文件,同时保持支持修剪的分区边界。
没有适合每个系统的通用文件大小。根据对象存储行为、查询并发性、行宽、内存限制、写入节奏和引擎指导进行选择。测量规划时间以及扫描吞吐量。
Parquet 不是表格式
Parquet文件描述了该文件内的数据。它本身并不提供跨数千个文件的事务日志、快照隔离、原子多文件提交、行级更改或属于当前表状态的文件目录。
数据平台可以通过其目录和表层管理这些问题。此区分在更新和架构更改时很重要。在目录中列出每个对象并将其视为当前数据时,可能会包括过时或部分写入的文件,除非周围系统定义提交语义。
架构演变
添加一个可选列通常是可管理的,因为较旧的文件简单地没有它,读取器可以提供空值。重命名列更难,因为基于名称的读取器可能会看到两个不同的字段。一些生态系统跟踪稳定的字段标识符,但支持必须在写入者、读取者和表层之间保持一致。
更改物理或逻辑类型需要兼容性计划。扩展整数可能在某些读者中有效;将字符串更改为嵌套记录是语义上的断裂。存储模式版本,在发布之前验证新文件,并测试混合版本读取。
不要将某个文件的模式视为整个数据集的契约。一个目录可能包含由不同的作业或在不同时间编写的文件。目录模式和摄取验证应定义接受的内容。
常见的 Parquet 用例
数据湖存储
大型验证数据集存储在对象存储中,以便分布式查询引擎进行选择性扫描。
仓库交换
批量加载和卸载使用打过类型的列文件,以减少传输和解析工作。
机器学习特征
训练和批评分作业读取多个记录中选择的特征列,而无需解析无关的文本字段。
历史网页数据
规范化产品、搜索、市场或内容观察可以按收集时间进行分区,并通过选定维度进行查询。
何时不使用 Parquet
Parquet 不适合需要手动编辑的文档、公共 API 响应,或一系列独立的小消息。它对于频繁的单行更新和没有索引或表引擎的直接键值查找也很尴尬。
CSV 可能更适合简单的分析师交接。JSON 或 NDJSON 可能更适合服务和事件处理。一个事务数据库可能更适合可变操作状态。同一管道可以以一种格式处理原始输入,然后以 Parquet 发布经过策划的分析层。
如何创建可靠的 Parquet 数据
- 定义规范模式。 指定可为空性、逻辑类型、时间戳语义、小数精度和嵌套结构。
- 验证传入的记录。 在写入文件之前解决类型冲突和格式不正确的值。
- 按测量选择行组和文件目标。 平衡内存、压缩、并行性和元数据开销。
- 真实过滤器进行分区。 避免高基数路径和空分区。
- 测试每个读取器。 确认嵌套类型、逻辑注释、压缩编解码器和部署的引擎集的模式演化。
- 通过数据集层原子发布。 在验证和目录更新成功之前使不完整的文件不可见。
结论
Apache Parquet 将打过类型的记录转化为列式文件,分析系统可以选择性地读取。它的模式、编码、压缩、统计信息和对嵌套数据的支持减少了许多重扫描工作负载的不必要 I/O。那些好处依赖于良好的数据集设计:受控模式、合理的文件和行组、实用的分区、兼容的读取器,以及在事务或快照重要时的表层。Parquet 最强大的是作为策划的分析目的地,而不是作为 JSON、CSV、数据库或事件格式的通用替代品。
准备构建列式数据管道了吗?
使用 Scrapeless Scraping API 收集结构化网页数据,验证记录,并发布用于分析的打过类型的 Parquet 数据集。
今天注册并获得 5 美元的免费额度 — 无需信用卡.
领取您的 5 美元信用 →常见问题
Parquet 是数据库吗?
不,Parquet 是一种文件格式。查询引擎、目录、对象存储和表层提供围绕 Parquet 文件的类似数据库的管理和访问。
为什么 Parquet 在分析中比 CSV 更快?
Parquet 可以读取选定的列,使用元数据跳过不相关的数据范围,并解码打过类型的二进制值。CSV 读取器通常会扫描并解析每条记录的文本。
Parquet 可以存储嵌套 JSON 数据吗?
是的,Parquet 支持嵌套记录、列表和映射,但管道必须将不一致的 JSON 形状解析为稳定的模式。
人们可以在文本编辑器中打开 Parquet 吗?
不,Parquet 是二进制的,需要读取器或查询工具。当需要直接在电子表格中访问时,将选定的结果导出为 CSV。
Parquet 支持模式演化吗?
Parquet 数据集可以演化,特别是通过可选列的添加,但兼容性取决于类型、字段身份、读取器和周围的表层。在发布之前测试混合模式读取。