Apache Iceberg on AWS - 理解Iceberg表格式

通过Glue ETL Job将Aurora数据导入到Iceberg表后,我们可以在对应的S3桶中看到如下数据目录:

其中,metadata目录存放了Iceberg表的元数据,data存放实际的数据文件。

Metadata数据解析

元数据 JSON 文件

  • 00000-a4fe4565-e128-4f1c-aea6-18471c4e8748.metadata.json
  • 00001-5fc33466-9cd7-4d02-87c9-71e4cc2c1627.metadata.json

这些是 Iceberg 表的元数据文件,以数字序列开头(00000, 00001),表示元数据版本。它们包含表的模式定义、分区信息、快照历史等。序列号越大,表示越新的元数据版本。

让我们来看下具体的metadata内容:

json 复制代码
{
  "format-version" : 2,
  "table-uuid" : "163526bc-3eef-4fb9-b92b-0ccb37a90117",
  "location" : "s3://iceberg-workshop-datalake-7arcfcyrvanr/public_customers",
  "last-sequence-number" : 1,
  "last-updated-ms" : 1752391363612,
  "last-column-id" : 5,
  "current-schema-id" : 0,
  "schemas" : [ {
    "type" : "struct",
    "schema-id" : 0,
    "fields" : [ {
      "id" : 1,
      "name" : "customer_id",
      "required" : false,
      "type" : "int",
      "doc" : ""
    }, {
      "id" : 2,
      "name" : "whisker_name",
      "required" : false,
      "type" : "string",
      "doc" : ""
    }, {
      "id" : 3,
      "name" : "email",
      "required" : false,
      "type" : "string",
      "doc" : ""
    }, {
      "id" : 4,
      "name" : "paw_phone",
      "required" : false,
      "type" : "string",
      "doc" : ""
    }, {
      "id" : 5,
      "name" : "membership_date",
      "required" : false,
      "type" : "timestamp",
      "doc" : ""
    } ]
  } ],
  "default-spec-id" : 0,
  "partition-specs" : [ {
    "spec-id" : 0,
    "fields" : [ ]
  } ],
  "last-partition-id" : 999,
  "default-sort-order-id" : 0,
  "sort-orders" : [ {
    "order-id" : 0,
    "fields" : [ ]
  } ],
  "properties" : {
    "write.parquet.compression-codec" : "zstd"
  },
  "current-snapshot-id" : 5279933414298446801,
  "refs" : {
    "main" : {
      "snapshot-id" : 5279933414298446801,
      "type" : "branch"
    }
  },
  "snapshots" : [ {
    "sequence-number" : 1,
    "snapshot-id" : 5279933414298446801,
    "timestamp-ms" : 1752391363612,
    "summary" : {
      "operation" : "append",
      "spark.app.id" : "spark-application-1752391336970",
      "added-data-files" : "10",
      "added-records" : "10",
      "added-files-size" : "17225",
      "changed-partition-count" : "1",
      "total-records" : "10",
      "total-files-size" : "17225",
      "total-data-files" : "10",
      "total-delete-files" : "0",
      "total-position-deletes" : "0",
      "total-equality-deletes" : "0",
      "engine-version" : "3.5.4-amzn-0",
      "app-id" : "spark-application-1752391336970",
      "engine-name" : "spark",
      "iceberg-version" : "Apache Iceberg 4f0aa51 (commit 4f0aa5157785b36d43eaaeb48d870fdb4a57d768)"
    },
    "manifest-list" : "s3://iceberg-workshop-datalake-7arcfcyrvanr/public_customers/metadata/snap-5279933414298446801-1-73aeaf0e-d9af-42cd-abd5-45e352d1b137.avro",
    "schema-id" : 0
  } ],
  "statistics" : [ ],
  "partition-statistics" : [ ],
  "snapshot-log" : [ {
    "timestamp-ms" : 1752391363612,
    "snapshot-id" : 5279933414298446801
  } ],
  "metadata-log" : [ {
    "timestamp-ms" : 1752390893889,
    "metadata-file" : "s3://iceberg-workshop-datalake-7arcfcyrvanr/public_customers/metadata/00000-a4fe4565-e128-4f1c-aea6-18471c4e8748.metadata.json"
  } ]
}

基本信息

  • 格式版本format-version: 2(使用的是 Iceberg v2 格式)
  • 表 UUID163526bc-3eef-4fb9-b92b-0ccb37a90117(表的唯一标识符)
  • 位置s3://iceberg-workshop-datalake-7arcfcyrvanr/public_customers(表数据存储的 S3 路径)
  • 最后序列号1(最后操作的序列号)
  • 最后更新时间1752391363612(毫秒时间戳,对应 2025 年 7 月 13 日)

表结构定义

  • 当前 Schema ID0
  • 最后列 ID5(表中定义的最大列 ID)
  • 表结构 :包含 5 个字段
    • customer_id(整数类型)
    • whisker_name(字符串类型)
    • email(字符串类型)
    • paw_phone(字符串类型)
    • membership_date(时间戳类型)
    • 所有字段都是可空的(required: false

分区和排序信息

  • 分区规范 :使用默认分区规范 ID 0,没有定义分区字段(fields: []
  • 排序规范 :使用默认排序规范 ID 0,没有定义排序字段(fields: []

表属性

  • 使用 zstd 压缩算法存储 Parquet 文件:"write.parquet.compression-codec" : "zstd"

快照信息

  • 当前快照 ID5279933414298446801
  • 分支引用main 分支指向当前快照
  • 快照详情
    • 序列号:1
    • 创建时间:1752391363612(2025 年 7 月 13 日)
    • 操作类型:append(数据追加操作)
    • 添加了 10 个数据文件,包含 10 条记录
    • 数据文件总大小:17225 字节
    • 使用的是 Spark 3.5.4 引擎
    • 清单列表文件:s3://iceberg-workshop-datalake-7arcfcyrvanr/public_customers/metadata/snap-5279933414298446801-1-73aeaf0e-d9af-42cd-abd5-45e352d1b137.avro 日志信息
  • 快照日志:记录了快照 ID 和创建时间
  • 元数据日志:记录了元数据文件的历史,包含一个条目指向初始元数据文件

Avro 数据文件

  • 73aeaf0e-d9af-42cd-abd5-45e352d1b137-m0.avro
  • snap-5279935414298446801-1-73aeaf0e-d9af-42cd-abd5-45e352d1b137.avro

这些是 Avro 格式的文件:

  • 带有 -m0.avro 后缀的通常是清单文件(manifest file),包含数据文件的列表和元数据
  • 带有 snap- 前缀的是快照相关的文件,记录表在特定时间点的状态
相关推荐
武子康1 天前
大数据-242 离线数仓 - DataX 实战:MySQL 全量/增量导入 HDFS + Hive 分区(离线数仓 ODS
大数据·后端·apache hive
SelectDB2 天前
易车 × Apache Doris:构建湖仓一体新架构,加速 AI 业务融合实践
大数据·agent·mcp
武子康2 天前
大数据-241 离线数仓 - 实战:电商核心交易数据模型与 MySQL 源表设计(订单/商品/品类/店铺/支付)
大数据·后端·mysql
IvanCodes2 天前
一、消息队列理论基础与Kafka架构价值解析
大数据·后端·kafka
武子康3 天前
大数据-240 离线数仓 - 广告业务 Hive ADS 实战:DataX 将 HDFS 分区表导出到 MySQL
大数据·后端·apache hive
字节跳动数据平台4 天前
5000 字技术向拆解 | 火山引擎多模态数据湖如何释放模思智能的算法生产力
大数据
武子康4 天前
大数据-239 离线数仓 - 广告业务实战:Flume 导入日志到 HDFS,并完成 Hive ODS/DWD 分层加载
大数据·后端·apache hive
字节跳动数据平台5 天前
代码量减少 70%、GPU 利用率达 95%:火山引擎多模态数据湖如何释放模思智能的算法生产力
大数据
得物技术5 天前
深入剖析Spark UI界面:参数与界面详解|得物技术
大数据·后端·spark
武子康5 天前
大数据-238 离线数仓 - 广告业务 Hive分析实战:ADS 点击率、购买率与 Top100 排名避坑
大数据·后端·apache hive