当前位置: 首页 > news >正文

RCFile数据读取流程

以下通过一个具体的例子,详细说明 RCfile 的同步标记如何帮助跳过无关的数据行组(Row Group),从而提升查询效率:


场景设定

假设有一个 用户行为日志表,存储在 RCfile 中,包含以下字段:

| user_id (BIGINT) | action_time (TIMESTAMP) | action_type (STRING) |
  • 数据按 action_time 的日期范围分区(如每天一个文件)。
  • 每个 RCfile 的行组大小为 4MB,每个行组包含约 10,000 行数据

查询需求

执行如下查询,筛选 2023-10-01 当天的用户行为

SELECT user_id 
FROM user_logs 
WHERE action_time BETWEEN '2023-10-01 00:00:00' AND '2023-10-01 23:59:59';

同步标记的作用流程

步骤 1:文件物理结构

假设目标文件 user_logs_202310.rcfile 包含 3 个行组,每个行组的元数据如下:

行组 ID数据行数action_time 最小值action_time 最大值同步标记位置
RG110,0002023-10-01 08:00:002023-10-01 12:00:000xABCD1234
RG210,0002023-10-01 18:00:002023-10-02 06:00:000xEFGH5678
RG310,0002023-10-02 08:00:002023-10-02 20:00:000xIJKL9012
步骤 2:查询执行过程
  1. 定位文件起始位置

    • 查询引擎(如 Hive)首先读取文件头,发现第一个同步标记 0xABCD1234,确认行组 RG1 的起始位置。
  2. 检查行组元数据

    • 读取 RG1 的元数据头,发现其时间范围为 2023-10-01 08:00:00 ~ 2023-10-01 12:00:00完全包含在查询条件内
    • 决策:需要读取 RG1 的所有数据。
  3. 跳过无关行组

    • 引擎通过同步标记 0xEFGH5678 定位到 RG2 的起始位置。
    • 检查 RG2 的元数据头,发现其时间范围为 2023-10-01 18:00:00 ~ 2023-10-02 06:00:00部分超出查询条件
    • 决策:仅读取 RG2 中时间在 2023-10-01 当天的数据。
  4. 完全跳过无关行组

    • 引擎通过同步标记 0xIJKL9012 定位到 RG3 的起始位置。
    • 检查 RG3 的元数据头,发现其时间范围为 2023-10-02 08:00:00 ~ 2023-10-02 20:00:00完全不满足查询条件
    • 决策:直接跳过整个 RG3 行组,无需读取其数据块。

关键机制解析

  1. 同步标记的快速定位

    • 同步标记是唯一的固定字节序列,引擎通过扫描这些标记,无需解析实际数据内容即可找到行组边界。
    • 跳过行组时,引擎直接计算下一同步标记的偏移量(根据当前行组大小),大幅减少 I/O 操作。
  2. 元数据头的过滤作用

    • 每个行组的元数据头记录了该行组内数据的统计信息(如时间范围)。
    • 若行组的元数据头显示其数据完全不符合查询条件,引擎直接跳过该行组。
  3. 减少数据读取量

    • 在上述例子中:
      • RG1:完全读取(10,000 行)
      • RG2:部分读取(假设 5,000 行满足条件)
      • RG3:完全跳过(0 行读取)
    • 总读取行数:15,000 行(仅需处理 50% 的数据)。

对比无同步标记的场景

若文件没有同步标记(如纯文本文件):

  1. 引擎必须逐行扫描整个文件,检查每行的 action_time 字段。
  2. 即使某些数据块明显不符合条件(如 RG3),也无法跳过,导致 30,000 行全量读取
  3. I/O 开销和计算时间显著增加。

总结

同步标记通过以下机制跳过无关数据:

  1. 物理边界标识:快速定位行组,避免逐行扫描。
  2. 元数据过滤:结合行组的统计信息,直接判断是否需要读取数据块。
  3. 并行化支持:多个任务可独立处理不同行组,互不干扰。

这种设计使得 RCfile 在分析型查询中(尤其是涉及范围过滤的查询)性能显著优于行式存储格式。

相关文章:

  • 前缀和--
  • 消息中间件——RocketMQ(一)
  • 【复旦微FM33 MCU 底层开发指南】高级定时器ATIM
  • 齐次坐标系统:什么是齐次坐标?为什么要引入齐次坐标?
  • Go - 内存逃逸
  • C语言--实现图的基本操作
  • 探秘 LangChain 函数定义
  • Java 性能优化:从原理到实践的全面指南
  • #systemverilog# 关于基于systemveriog验证平台的RTL+TB文件编译顺序问题的讨论
  • c++11--std::forwaord--完美转发
  • zk源码-7.ZAB协议和数据存储二
  • arm_math.h、arm_const_structs.h 和 arm_common_tables.h
  • 游戏引擎学习第217天
  • Day14:关于MySQL的索引——创、查、删
  • 【腾讯云智】20250329笔试算法题
  • QT聊天项目开发DAY02
  • NIPS2024论文 End-to-End Ontology Learning with Large Language Models
  • SpringBoot-Web开发
  • 网络空间安全(56)Laravel框架讲解
  • NoSQL入门指南:Redis与MongoDB的Java实战
  • 雅安市纪委监委回应黄杨钿甜耳环事件:相关政府部门正在处理
  • 首次带人形机器人走科技节红毯,傅利叶顾捷:没太多包袱,很多事都能从零开始
  • 下周或迎外贸“抢出口”高峰,跨境电商敏感货物如何便利化“登机”?
  • 湖南慈利一村干部用AI生成通知并擅自发布,乡纪委立案
  • 李公明︱一周书记:当前科学观中的盲点、危机与……人类命运
  • 证券日报:降准今日正式落地,年内或还有降准空间