Apache Iceberg Spark查询操作完全指南

Apache Iceberg Spark查询操作完全指南

iceberg Apache Iceberg iceberg 项目地址: https://gitcode.com/gh_mirrors/iceberg4/iceberg

概述

Apache Iceberg作为一种高性能的表格式,为Spark提供了强大的查询能力。本文将详细介绍如何在Spark中使用SQL和DataFrame API查询Iceberg表,包括基础查询、时间旅行、增量读取以及表元数据检查等技术要点。

基础查询操作

SQL查询

在Spark 3中,Iceberg表使用包含目录名称的标识符:

-- 查询prod目录下db数据库中的table表
SELECT * FROM prod.db.table;

DataFrame查询

使用Spark DataFrame API加载Iceberg表:

val df = spark.table("prod.db.table")
表标识符解析规则

当使用spark.read.format("iceberg").load(table)spark.table(table)时,表标识符解析遵循以下优先级:

  1. file:///path/to/table - 从指定路径加载Hadoop表
  2. tablename - 从当前目录和命名空间加载表
  3. catalog.tablename - 从指定目录加载表
  4. namespace.tablename - 从当前目录的指定命名空间加载表
  5. catalog.namespace.tablename - 从指定目录的命名空间加载表
  6. namespace1.namespace2.tablename - 从当前目录的多级命名空间加载表

高级查询功能

时间旅行查询

时间旅行功能允许查询表在特定时间点或特定版本的状态。

SQL语法

Spark 3.3+支持以下时间旅行语法:

-- 基于时间戳查询
SELECT * FROM prod.db.table TIMESTAMP AS OF '1986-10-26 01:21:00';
SELECT * FROM prod.db.table FOR SYSTEM_TIME AS OF '1986-10-26 01:21:00';

-- 基于快照ID查询
SELECT * FROM prod.db.table VERSION AS OF 10963874102873;
SELECT * FROM prod.db.table FOR SYSTEM_VERSION AS OF 10963874102873;

-- 基于分支或标签查询
SELECT * FROM prod.db.table VERSION AS OF 'audit-branch';
SELECT * FROM prod.db.table FOR SYSTEM_VERSION AS OF 'historical-snapshot';

-- 使用Unix时间戳(秒)
SELECT * FROM prod.db.table TIMESTAMP AS OF 499162860;
DataFrame API
// 基于时间戳查询
spark.read
  .option("as-of-timestamp", "499162860000")  // 毫秒时间戳
  .format("iceberg")
  .load("path/to/table")

// 基于快照ID查询
spark.read
  .option("snapshot-id", 10963874102873L)
  .format("iceberg")
  .load("path/to/table")

// 基于标签查询
spark.read
  .option(SparkReadOptions.TAG, "historical-snapshot")
  .format("iceberg")
  .load("path/to/table")

// 基于分支查询
spark.read
  .option(SparkReadOptions.BRANCH, "audit-branch")
  .format("iceberg")
  .load("path/to/table")

增量查询

增量查询功能允许获取两个快照之间新增的数据:

spark.read
  .format("iceberg")
  .option("start-snapshot-id", "10963874102873")  // 起始快照ID(不包含)
  .option("end-snapshot-id", "63874143573109")   // 结束快照ID(包含)
  .load("path/to/table")

注意:目前仅支持append操作的数据,不支持replace、overwrite和delete操作。

表元数据检查

Iceberg提供了丰富的元数据表,用于检查表的历史、快照和文件信息。

历史记录

SELECT * FROM prod.db.table.history;

结果包含快照ID、创建时间、父快照ID等信息。

快照信息

SELECT * FROM prod.db.table.snapshots;

可以获取每个快照的操作类型、清单文件位置等详细信息。

文件信息

-- 查询当前所有文件(包括数据文件和删除文件)
SELECT * FROM prod.db.table.files;

-- 仅查询数据文件
SELECT * FROM prod.db.table.data_files;

-- 仅查询删除文件
SELECT * FROM prod.db.table.delete_files;

-- 查询所有快照中的文件
SELECT * FROM prod.db.table.all_files;

文件信息表中包含文件路径、格式、记录数、列统计信息等丰富元数据。

清单文件

SELECT * FROM prod.db.table.manifests;

清单文件表展示了每个清单文件的路径、大小、分区信息等。

最佳实践

  1. 对于生产环境查询,建议始终使用完整的三段式表名(catalog.database.table)
  2. 时间旅行查询时,优先使用时间戳而非快照ID,更符合业务语义
  3. 检查表元数据时,注意files表和data_files/delete_files表的区别
  4. 增量查询适合ETL场景,但不支持所有操作类型,使用前需确认业务需求

通过合理利用Iceberg的这些查询特性,可以构建出更灵活、更高效的数据处理流程。

iceberg Apache Iceberg iceberg 项目地址: https://gitcode.com/gh_mirrors/iceberg4/iceberg

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

方拓行Sandra

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值