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 官方文档。