<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Apache Parquet on Yeqown</title>
    <link>https://www.yeqown.xyz/tags/Apache-Parquet/</link>
    <description>Recent content in Apache Parquet on Yeqown</description>
    <generator>Hugo</generator>
    <language>en-US</language>
    <lastBuildDate>Fri, 07 Aug 2026 00:00:00 +0800</lastBuildDate>
    <atom:link href="https://www.yeqown.xyz/tags/Apache-Parquet/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Parquet 文件格式解析</title>
      <link>https://www.yeqown.xyz/2026/08/07/Parquet%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E5%8E%9F%E7%90%86/</link>
      <pubDate>Fri, 07 Aug 2026 00:00:00 +0800</pubDate>
      <guid>https://www.yeqown.xyz/2026/08/07/Parquet%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E5%8E%9F%E7%90%86/</guid>
      <description>&lt;p&gt;Parquet 诞生时，Hadoop 生态中的数据处理框架正在快速增多。同一份数据会被不同工具反复读取，却缺少一种独立于计算框架的高效列式格式。分析查询通常只需要少数几列；按完整记录读取，会把大量 I/O 浪费在无关字段上。&lt;/p&gt;&#xA;&lt;p&gt;Parquet 并非第一个列式存储格式。它的价值在于把列式表示、编码和压缩写进一套公开的文件规范，并借鉴 Google Dremel 的记录拆分与重组算法来表示嵌套数据。项目最初由 Twitter、Cloudera 等贡献者开发，2014 年进入 Apache Incubator，次年毕业成为 Apache 顶级项目。现在，多种语言和分析工具都能直接读写 Parquet。&lt;/p&gt;&#xA;&lt;p&gt;正文固定读取 &lt;code&gt;parquet-lab/transactions-small.parquet&lt;/code&gt;。这是一份未加密的普通 Parquet 文件，由&lt;a href=&#34;#%e9%99%84%e5%bd%95-b%e5%8f%af%e5%a4%8d%e7%8e%b0%e5%ae%9e%e9%aa%8c%e4%b8%8e%e6%a3%80%e6%9f%a5%e6%b8%85%e5%8d%95&#34;&gt;附录 B&lt;/a&gt;中的脚本生成。样例有 30,000 行、3 个 Row Group 和 8 个叶子列。精确大小与校验值集中列在附录中。除附录 A 的嵌套示例外，正文中的 &lt;code&gt;parquet&lt;/code&gt; 与 DuckDB 命令都读取这份文件。&lt;/p&gt;&#xA;&lt;p&gt;现在给查询引擎一个具体问题：从这份交易文件中，按用户汇总 2026 年 5 月 8 日 03:00 到 04:00 的交易净额。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; user_id, &lt;span style=&#34;color:#66d9ef&#34;&gt;SUM&lt;/span&gt;(amount)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; transactions&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;WHERE&lt;/span&gt; created_at &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TIMESTAMP&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2026-05-08 03:00:00&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;AND&lt;/span&gt; created_at &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;TIMESTAMP&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2026-05-08 04:00:00&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;GROUP&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;BY&lt;/span&gt; user_id;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;通过 SQL 可得到结果列、过滤条件和聚合方式，却无法告诉读取器这些列数据在文件中的具体位置。执行查询前还要回答三个问题：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Schema 如何定义，&lt;code&gt;user_id&lt;/code&gt;、&lt;code&gt;amount&lt;/code&gt; 和 &lt;code&gt;created_at&lt;/code&gt; 对应哪些叶子列？&lt;/li&gt;&#xA;&lt;li&gt;哪些 Row Group 和 Page 不可能满足时间条件，可以直接跳过？&lt;/li&gt;&#xA;&lt;li&gt;候选列采用什么编码和压缩，读取器怎样找到并解码它们？&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;h2 id=&#34;1-parquet-文件结构&#34;&gt;1. Parquet 文件结构&lt;a class=&#34;anchor&#34; href=&#34;#1-parquet-%e6%96%87%e4%bb%b6%e7%bb%93%e6%9e%84&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;先看完整文件，再模拟查询。图中的粗边界表示 &lt;code&gt;File -&amp;gt; Row Group -&amp;gt; Column Chunk -&amp;gt; Page&lt;/code&gt;。细线只表示局部放大，不是数据流。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
