Paimon系统表用于存储Paimon表的元数据和特定的数据消费行为。本文为您介绍Paimon元数据系统表和特定消费行为的有关系统表作用,相关的字段及含义等。
元数据系统表
Snapshots系统表
Snapshots系统表可以查询每个快照文件的具体信息,例如快照文件的编号,快照文件的创建时间等。
以下SQL语句查询mycatalog.mydb.mytbl的Snapshots系统表。
SELECT * FROM mycatalog.mydb.`mytbl$snapshots`;Snapshots系统表常用的列如下。
| 列名 | 数据类型 | 含义 | 
| snapshot_id | Long | 快照文件的编号。 | 
| schema_id | Long | 快照文件对应的表结构文件编号,表结构文件的内容可在Schemas系统表中查看。 | 
| commit_time | Timestamp | 快照文件的创建时间。 | 
| total_record_count | Long | 快照文件指向的数据文件中数据的总条数。 说明  数据文件需要在内存中归并之后才能产出真正的数据。因此total_record_count列的取值并不等于Paimon表逻辑上保存的数据条数。 | 
| delta_record_count | Long | 与上一个快照文件相比,数据文件中增加的数据条数。 | 
| changelog_record_count | Long | 本次快照产生的变更数据条数。 | 
Schemas系统表
Schemas系统表可以查询表的当前以及历史结构信息。每次通过ALTER TABLE语句或CREATE TABLE AS(CTAS)语句或CREATE DATABASE AS(CDAS)语句修改Paimon表的结构时,都会在Schemas系统表中增加一条记录。以下SQL语句查询mycatalog.mydb.mytbl的Schemas系统表。
SELECT * FROM mycatalog.mydb.`mytbl$schemas`;Schemas系统表常用的列如下。
| 列名 | 数据类型 | 含义 | 
| schema_id | Long | 表结构的编号。 | 
| fields | String | 每一列的名称以及类型等。 | 
| partition_keys | String | 分区列的名称。 | 
| primary_keys | String | 主键的名称。 | 
| options | String | 表参数的值。 | 
| comment | String | 表的备注信息。 | 
| update_time | Timestamp | 表结构修改的时间。 | 
Options系统表
Options系统表可以查询当前配置的表参数。
以下SQL语句查询mycatalog.mydb.mytbl的Options系统表。
SELECT * FROM mycatalog.mydb.`mytbl$options`;Options系统表常用的列如下。
| 列名 | 数据类型 | 含义 | 
| key | String | 配置项的名称。 | 
| value | String | 配置项的值。 | 
未显示的表参数将使用默认值。
Partitions系统表
Partitions系统表可以查询Paimon表里有哪些分区、每个分区的数据总数,以及文件总量。
以下SQL语句查询mycatalog.mydb.mytbl对应的Partitions系统表。
SELECT * FROM mycatalog.mydb.`mytbl$partitions`;Partitions系统表常用的列如下。
| 列名 | 数据类型 | 含义 | 
| partition | String | 分区值,格式为 | 
| record_count | Long | 分区内的数据条数。 说明  数据文件还需要在内存中归并之后才能产出真正的数据,因此record_count列的取值并不等于该分区逻辑上保存的数据条数。 | 
| file_size_in_bytes | Long | 分区内的文件总大小,以字节为单位。 未被当前快照文件指向的历史数据文件不会被统计。 | 
Files系统表
Files系统表可以查询某个快照文件指向的所有数据文件,包括数据文件的格式、文件内的数据条数和文件大小等。
以下SQL语句查询mycatalog.mydb.mytbl最新快照对应的Files系统表。
SELECT * FROM mycatalog.mydb.`mytbl$files`;以下SQL语句查询mycatalog.mydb.mytbl编号为5的快照对应的Files系统表。
SELECT * FROM mycatalog.mydb.`mytbl$files` /*+ OPTIONS('scan.snapshot-id'='5') */;Files系统表常用的列如下。
| 列名 | 数据类型 | 含义 | 
| partition | String | 文件所在的分区,格式为 | 
| bucket | Integer | 文件所在的分桶,只对固定分桶的主键表有意义。 | 
| file_path | String | 文件路径。 | 
| file_format | String | 文件格式。 | 
| schema_id | Long | 快照文件对应的表结构文件编号,表结构文件的内容可在Schemas系统表中查看。 | 
| level | Integer | 文件所在的LSM层级,只对主键表有意义。 level = 0的文件就是未合并的小文件。通过查询某个分桶level = 0的文件数量,可以了解该分桶小文件合并的情况。 | 
| record_count | Long | 文件内的数据条数。 | 
| file_size_in_bytes | Long | 文件大小,以字节为单位。 | 
未被当前快照文件指向的历史数据文件不会显示在查询结果里。
Tags系统表
Tags系统表可以查询每个Tag文件的具体信息,例如Tag的名称、创建Tag时使用的快照编号等。
以下SQL语句查询mycatalog.mydb.mytbl的Tags系统表。
SELECT * FROM mycatalog.mydb.`mytbl$tags`;Tags系统表常用的列如下。
| 列名 | 数据类型 | 含义 | 
| tag_name | String | Tag名称。 | 
| snapshot_id | Long | 创建Tag时基于的快照的编号。 | 
| schema_id | Long | Tag对应的表结构编号,可在Schemas系统表中查询编号对应的具体表结构。 | 
| commit_time | Timestamp | 创建Tag时基于的快照的创建时间。 | 
| record_count | Long | 文件内的数据条数。 | 
特定消费行为的系统表
Read-optimized系统表
通常,Paimon表在消费过程中,需要将数据文件在内存中归并之后,才能产出真正的数据,一定程度上会影响查询效率。如果您对Paimon主键表的批作业读取效率,或即席(OLAP)查询效率有较高的要求,可以消费该Paimon表对应的Read-optimized系统表。Read-optimized系统表只读取不需要合并的文件(主要是小文件全量合并后的数据文件),因此省去了在内存中归并排序的流程,提高了查询效率。然而,小文件的全量合并频率较低,因此read-optimized系统表产出的数据时效性偏低。您可以配置以下参数,使得小文件全量合并在一段时间后强制进行,在写入效率、消费效率与数据时效性之间进行平衡。
| 参数 | 说明 | 数据类型 | 默认值 | 备注 | 
| compaction.optimization-interval | 超过该时间间隔后,强制进行小文件的全量合并。 | Duration | 无 | 如果小文件的全量合并过于频繁,可能导致写入作业效率偏低。因此推荐该参数值设置在 | 
以下SQL语句查询mycatalog.mydb.mytbl最新快照对应的Read-optimized系统表。
SELECT * FROM mycatalog.mydb.`mytbl$ro`;Audit Log系统表
如果您在消费Paimon表的过程中,需要了解每一条数据的操作类型是插入还是删除,可以消费该Paimon表对应的Audit Log系统表。Audit log系统表产出的数据与对应的Paimon表一致,只是会在每条数据第1列的前面新增一个rowkind列,显式保存这条数据的类型,数据的操作类型共有+I(insert)、-U(update before)、+U(update after)、-D(delete)四种。而对于Audit Log系统表里的每条数据而言,它的数据操作类型都是+I(insert)
以下SQL语句查询mycatalog.mydb.mytbl最新快照对应的audit_log系统表。
SELECT * FROM mycatalog.mydb.`mytbl$audit_log`;相关文档
关于每种系统表完整的表结构详情,请参见Apache Paimon 官方文档。