Apache Iceberg 底层数据查询原理解析

 更新时间:2024年09月27日 16:11:01   作者:喻师傅  
Apache Iceberg是一个开源表格格式,用于大型分析数据集,本文主要介绍了如何通过快照、Manifest文件和元数据文件查询Iceberg表的数据,通过解析元数据文件获取当前表的快照ID,进而读取对应的Avro文件和Manifest文件中的Parquet数据文件,感兴趣的朋友一起看看吧

Apache Iceberg 概述-链接

Apache Iceberg 底层数据存储

Iceberg 数据组织图(HDFS): 5个SnapShot对应5个manifest list清单列表。

1.查询最新快照数据

获取最新元数据
获取 Iceberg 表的最新元数据文件,eg:00000-ec504.metadata.json

解析元数据
从元数据文件中提取以下信息:

  • 当前表的快照 ID:949358624197301886
  • 所有快照信息:在 JSON 中的 snapshots 数组。

获取快照文件信息
根据快照 ID,找到对应的 Avro 文件信息,eg:snap--32800.avro

在该快照文件中,提取 Manifest File清单文件信息:

  • *32800-m0.avro
  • *2abba-m0.avro
  • *d33de-m0.avro
  • *748bf-m0.avro
  • *b946e-m0.avro

读取最新数据
读取以上 Manifest File清单文件中描述的 Parquet 数据文件(Data files)。

分析 Snap 文件
snap--32800.avro 文件中,可以找到以下属性:

  • deleted data files count
  • added data files count
  • existing data files count

判断数据文件状态
Iceberg 根据 deleted data files count 判断是否存在被删除的数据:

如果该值大于 0,表示对应的 Manifest 文件中有已删除的数据。读取数据时,无需读取这些被删除的文件。

Manifest 清单文件分析
根据 Manifest 清单文件,找到对应的 Parquet 文件存储位置。
每个 Manifest 文件中有 status 属性:

1:代表对应的 Parquet 文件为新增文件,需要读取。

2:代表 Parquet 文件被删除。

2.查询指定快照(历史快照)数据

Apache Iceberg 支持查询历史上任何时刻的快照。

要查询特定快照,需要指定 snapshot-id 属性,可以通过 Spark 或 Flink 实现。

在 Spark 中查询指定快照的数据:

spark.read
  .option("snapshot-id", 6155488348798912701L)
  .format("iceberg")
  .load("path")

查询某个快照数据的原理:

指定快照 ID
在读取数据时,通过 snapshot-id 指定要查询的快照。

查找快照信息
Iceberg 会根据指定的快照 ID 检索相关的元数据(如下metadata里面的snapshots数组),包括快照中包含的数据文件和 Manifest 文件。

3.根据时间戳查询某个快照数据

Apache Iceberg 支持通过 as-of-timestamp 参数读取特定时间戳的快照数据,通常也是通过 Spark 或 Flink 实现。

在 Spark 中根据时间戳查询数据:

spark.read
  .option("as-of-timestamp", "时间戳")
  .format("iceberg")
  .load("path")

指定时间戳
使用 as-of-timestamp 指定要查询的时间点。

查找快照信息
Iceberg 将查找与时间戳对应的快照,利用 *.metadata.json 文件中的信息。

属性解析
在元数据文件中,除了 current-snapshot-idsnapshots 属性外,还有一个 snapshot-log 属性,该属性记录了快照的历史信息。

到此这篇关于Apache Iceberg - 底层数据查询原理的文章就介绍到这了,更多相关Apache Iceberg原理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Linux配置和使用i3窗口管理器的教程

    Linux配置和使用i3窗口管理器的教程

    今天小编就为大家分享一篇关于Linux配置和使用i3窗口管理器的教程,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • 详解Linux下挂载新硬盘方法

    详解Linux下挂载新硬盘方法

    这篇文章主要介绍了详解Linux下挂载新硬盘方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • 你需要知道的16个Linux服务器监控命令

    你需要知道的16个Linux服务器监控命令

    如果你想知道你的服务器正在做干什么,你就需要了解一些基本的命令,一旦你精通了这些命令,那你就是一个 专业的 Linux 系统管理员
    2012-03-03
  • Linux cut 命令详解

    Linux cut 命令详解

    我们可以使用 cut 命令从一行字符串中于以字节,字符,字段(分隔符)等单位截取一部分内容出来。这篇文章主要介绍了Linux cut 命令的相关知识,需要的朋友可以参考下
    2020-07-07
  • linux命令实现音频格式转换和拼接的方法

    linux命令实现音频格式转换和拼接的方法

    今天小编就为大家分享一篇linux命令实现音频格式转换和拼接的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • linux跨服务器复制文件方式(scp含脚本批量复制)

    linux跨服务器复制文件方式(scp含脚本批量复制)

    这篇文章主要介绍了linux跨服务器复制文件方式(scp含脚本批量复制),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • linux压缩解压命令使用方式(无废话版)

    linux压缩解压命令使用方式(无废话版)

    本文介绍了gzip、bzip2、tar和zip四种常用的文件压缩和打包工具的使用方法,包括它们的功能、压缩比率、使用场景以及基本命令示例
    2024-11-11
  • 详解Linux LVM逻辑卷配置过程(创建,增加,减少,删除,卸载)

    详解Linux LVM逻辑卷配置过程(创建,增加,减少,删除,卸载)

    这篇文章主要介绍了详解Linux LVM逻辑卷配置过程(创建,增加,减少,删除,卸载),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Linux命令unzip详解

    Linux命令unzip详解

    这篇文章介绍了Linux命令unzip,Linux unzip命令用于解压缩zip文件,文中详细列出了unzip命令选项和选项描述。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • Linux命令之firewalld的用法

    Linux命令之firewalld的用法

    这篇文章主要介绍了Linux命令之firewalld的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04

最新评论