发布日期:2022-10-24 VIP内容

探索Iceberg表

为了检查表的历史、快照和其他元数据,Iceberg支持元数据表。

元数据表通过在原始表名之后添加元数据表名来标识。例如,db.table的历史记录是通过db.table.history表读取的。也就是说,元数据表,如history和snapshots,可以使用Iceberg表名作为命名空间。

例如,从prod.db.table的files元数据表中读取,运行以下语句:

SELECT * FROM prod.db.table.files

注意: 从Spark 3.0开始,检查的表名格式(catalog.database.table.metadata)与Spark的默认catalog(spark_catalog)不兼容。如果已经替换了默认目录,则可能需要使用DataFrameReader API来检查表。

1. History历史表

要显示表历史,代码如下:

spark.sql("SELECT * FROM prod.db.table.history").show()

执行以上代码,输出结果如图11-22所示。

这显示了一个回滚的提交。该示例有两个具有相同父节点的快照,其中一个不是当前表状态的祖先。

2. Snapshots快照表

要显示一个表的有效快照,代码如下:

spark.sql("SELECT * FROM prod.db.table.snapshots").show()

执行以上代码,输出结果如图11-23所示。

还可以将快照连接到表历史记录。例如,查询显示表历史,以及写每个快照的应用程序ID,代码如下:

spark.sql("""
    select
        h.made_current_at,
        s.operation,
        h.snapshot_id,
        h.is_current_ancestor,
        s.summary['spark.app.id']
    from prod.db.table.history h
    join prod.db.table.snapshots s
      on h.snapshot_id = s.snapshot_id
    order by made_current_at
""")

执行以上代码,输出结果如图11-24所示。

3. Files数据文件表

要显示一个表的数据文件和每个文件的元数据,代码如下:

spark.sql("SELECT * FROM prod.db.table.files").show()

输出结果如图11-25所示。

4. Manifests文件清单表

要显示一个表的文件清单(manifests)和每个文件的元数据,代码如下:

spark.sql("SELECT * FROM prod.db.table.manifests").show()

输出结果如图11-26所示。

在Spark 2.4或Spark 3中可以通过DataFrameReader API加载元数据表,代码如下:

// 命名的元数据表
spark.read
	.format("iceberg")
	.load("prod.db.table.files")
	.show(truncate = false)

// Hadoop path表
spark.read
	.format("iceberg")
	.load("hdfs://localhost:8020/path/to/table#files")
	.show(truncate = false)

Apache Iceberg提供了在给定时间点加载任何快照或数据的灵活性。例如,要检查版本历史,代码如下:

spark.read.table("local.db.table.history").show(10, false)

按照快照ID读取,代码如下:

spark.read.option("snapshot-id", 2626515310899177788L).table("local.db.table")

或者在任何给定的时间点读取,代码如下:

spark.read.option("as-of-timestamp", 1637879675001L).table("local.db.table")