LakeHouse

  • Apache Paimon PK 表的 data distribution

    这篇文章围绕 Apache Paimon PK 表的数据分布机制展开,梳理了 Fixed bucket、Dynamic bucket 和 Postpone bucket 三种 bucket 模式的路由方式、优缺点以及底层索引与 compact 行为。文章重点分析了主键不跨分区和跨分区更新两种场景下的差异,指出 fixed/postpone 在跨分区 upsert 时无法保证全局去重,而 dynamic bucket 会通过全局索引和额外写入删除记录来保证结果正确,但代价是 writer 初始化和性能开销更高。最后给出的建议是,在表设计时尽量把分区列纳入主键,以避免重复数据并获得更好的写入性能。

    2026年3月29日
    840
  • Arrow-rs Parquet Reader 浅析

    这篇文章从几个设计点切入,分析了 arrow-rs 上的 Parquet Reader 为什么和传统 C++ 系 Reader 有明显不同。正文先介绍 Bytes 零拷贝切片在 IO 合并场景下如何改善大 buffer 的生命周期管理,再说明文件系统接口如何把多 Range 读取与底层存储实现解耦,接着讨论 FileMetadata 解析优化、将 IO 与 decode 分离的 push 模式、以及延迟物化在跳页、RowSelection 选择、列缓存和零拷贝列构造上的具体做法,最后点出这些设计如何为未来更细粒度的内存控制和可观测性打下基础。

    2026年1月11日
    2472
  • Apache Iceberg Delete File 解析

    这篇文章围绕 Apache Iceberg Delete File 的三种实现展开,重点梳理 Position Delete、Equality Delete 和 Deletion Vector 在文件结构、写入来源与读时匹配逻辑上的差异。正文先分别说明三类 Delete File 如何记录被删除行、它们与 Data File 的对应关系以及 DeleteFileIndex 如何基于分区、路径和 spec 组织索引,随后分析 Data File 与 Delete File 的匹配规则,以及传统 Position Delete 和 Equality Delete 在 split 并发读取场景下带来的重复加载和执行开销,最后解释了为什么 Iceberg V3 更倾向用一对一的 Deletion Vector 替代旧方案。

    2025年6月22日
    1.1K1
  • Apache Iceberg 概念梳理

    这篇文章是一份面向源码阅读的 Apache Iceberg 概念梳理,目的不是讨论实现细节,而是把 Table Metadata、Snapshot、Manifest List、Manifest File、Manifest、Manifest Entry、Data File 和 Delete File 这些核心名词的层级关系先理顺。正文依次说明各类元信息文件和数据文件的职责,以及 Delete File 作为 Data File 变种在 Iceberg 中的定位,为后续继续阅读 Java 和 Rust 版本的 Iceberg 源码提供统一的术语参照。

    2025年5月1日
    1.2K2
  • Apache Parquet Bloom Filter

    这篇文章介绍了 Apache Parquet Bloom Filter 的实现与读取流程,重点聚焦于 Split Block Bloom Filter 在文件格式和 reader 侧的落地方式。正文先回顾 Bloom Filter 的基本原理以及它在 Parquet 中只适用于等值类谓词的前提,再解释 SBBF 如何把位图划分成 block 和 word,并利用 XxHash 将元素映射到单个 block 内完成插入与查找;后半部分进一步说明 BloomFilter 在 Thrift 元信息中的位置、PageHeader 与 Data 的读取方式,以及 reader 如何结合 offset、大小猜测和 IO 合并把每个 RowGroup 每列对应的 BloomFilter 加载出来。

    2024年11月23日
    1.6K1
  • Apache Parquet ZoneMap 过滤支持小记

    这篇文章围绕 Apache Parquet 中 ZoneMap 过滤的支持方式,讨论了 min-max 过滤在表达式系统里真正落地时会遇到的限制和工程实现选择。正文先说明 ZoneMap 适用的表达式类型以及单调函数、多列表达式和三值逻辑带来的复杂性,再结合 StarRocks 内表、ORC SearchArgument 和 DataFusion 的实现,分析它们如何把表达式改写成可用于 min-max 评估的形式、如何做 literal 推导与 prune,最后总结出各家当前基本都只在作用于单列的简单谓词上做 ZoneMap 过滤。

    2024年11月23日
    1.0K0
  • Apache Polaris 从入门到精通

    这篇文章从 Iceberg REST catalog 的标准接口讲起,系统介绍了 Apache Polaris 作为开源 REST catalog 管理系统的整体架构、权限模型和实际用法。正文先说明 Polaris 如何基于 REST API 为不同计算引擎提供统一 catalog 服务,以及 access control 与 vended-credentials 两大核心能力;随后拆解 catalog、namespace、table、view、principal、principal role、catalog role 和 privilege 之间的关系,并用一个只读 benchmark catalog 的案例演示如何创建资源、配置角色与权限,最后补充了 Polaris 在 UI、compaction 和生态完善度上的不足。

    2024年10月29日
    3.8K0
  • ORC vs Parquet,孰强孰弱?

    这篇文章从文件结构、类型系统、NULL 处理、复杂类型存储、统计信息、随机 IO、footer 大小和 schema evolution 等多个角度,对 ORC 与 Parquet 两种列式格式做了一次系统对比。正文先拆解 ORC 中 Stripe/Tail/ProtoBuf 元信息与 Parquet 中 RowGroup/Page/Thrift 元信息的组织方式,再讨论两者在统计信息粒度、最小读取单元、复杂类型表达和随机访问上的设计差异,最后重点分析 Parquet footer 较大带来的反序列化成本,以及 ORC 缺乏稳定子列 id 给 schema evolution 带来的实现复杂度。

    2024年8月10日
    4.3K4
  • Apache ORC 加密解析

    这篇文章介绍了 Apache ORC 的列级加密机制,重点解释 LocalKey 和 MasterKey 两层密钥体系如何配合 AES 完成列数据与统计信息的保护。正文先说明加密列、mask 策略和 KeyProvider 的基本角色,再介绍 IV 的生成规则、EncryptedLocalKey 与 MasterKey 的关系,以及加密数据在 ORC 文件中的排布方式,最后顺着 PostScript、Footer 和 Stripe 的读取流程,梳理 reader 如何获取 MasterKey、解出 LocalKey 并逐步还原出真正的列数据和加密统计信息。

    2024年7月7日
    1.1K0
  • RLE 编码在 Apache ORC 中的实现

    这篇文章系统梳理了 Apache ORC 中 RLE 编码的两套实现,重点介绍它们如何结合 varint、zigzag 和不同的分组规则压缩整数序列。正文先从最基础的 Run Length Encoding、无符号和有符号 varint 讲起,再解释 RLE version 1 如何用 header、delta 和 varint 编码重复或等差序列,随后继续拆解 RLE version 2 中 Short Repeat、Direct、Patched Base 和 Delta 四种编码模式的结构和适用场景,并用具体数字示例说明各类 header、bit width 和数据段的含义。

    2024年6月8日
    2.2K2