Apache Iceberg Spark查询操作完全指南
iceberg Apache 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)
时,表标识符解析遵循以下优先级:
file:///path/to/table
- 从指定路径加载Hadoop表tablename
- 从当前目录和命名空间加载表catalog.tablename
- 从指定目录加载表namespace.tablename
- 从当前目录的指定命名空间加载表catalog.namespace.tablename
- 从指定目录的命名空间加载表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;
清单文件表展示了每个清单文件的路径、大小、分区信息等。
最佳实践
- 对于生产环境查询,建议始终使用完整的三段式表名(catalog.database.table)
- 时间旅行查询时,优先使用时间戳而非快照ID,更符合业务语义
- 检查表元数据时,注意files表和data_files/delete_files表的区别
- 增量查询适合ETL场景,但不支持所有操作类型,使用前需确认业务需求
通过合理利用Iceberg的这些查询特性,可以构建出更灵活、更高效的数据处理流程。
iceberg Apache Iceberg 项目地址: https://gitcode.com/gh_mirrors/iceberg4/iceberg
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考