Skip to main content

Manage Statistics

Introduction

This page covers the Gravitino API for statistics. For what a statistic is, the difference between reserved and custom, and how partition statistics relate to partitions, see Statistics.

Statistics attach to tables. Custom names must begin with custom. to stay clear of names Gravitino may reserve later.

Table Statistics

Update Statistics

Updating creates a statistic that does not exist and overwrites one that does. Reserved statistics maintained by the system are not modifiable and the request is rejected.

curl -X PUT -H "Accept: application/vnd.gravitino.v1+json" \
-H "Content-Type: application/json" -d '{
"updates": {
"custom.last_reviewed": "2026-08-02",
"custom.owner_team": "risk"
}
}' http://localhost:8090/api/metalakes/example/objects/table/sales.public.orders/statistics

List Statistics

curl -X GET -H "Accept: application/vnd.gravitino.v1+json" \
http://localhost:8090/api/metalakes/example/objects/table/sales.public.orders/statistics

Drop Statistics

curl -X POST -H "Accept: application/vnd.gravitino.v1+json" \
-H "Content-Type: application/json" -d '{
"names": ["custom.owner_team"]
}' http://localhost:8090/api/metalakes/example/objects/table/sales.public.orders/statistics

Partition Statistics

Partition statistics are held by Gravitino rather than by the catalog, so they work on any table including catalogs that expose no partition objects. Partition names are supplied by the caller, and several partitions are read or written in one request.

Update Partition Statistics

curl -X PUT -H "Accept: application/vnd.gravitino.v1+json" \
-H "Content-Type: application/json" -d '{
"updates": [
{
"partitionName": "dt=2026-08-02",
"statistics": {"custom.row_estimate": "18000"}
}
]
}' http://localhost:8090/api/metalakes/example/objects/table/sales.public.orders/statistics/partitions

List Partition Statistics

Listing takes a partition range rather than a single name.

curl -X GET -H "Accept: application/vnd.gravitino.v1+json" \
"http://localhost:8090/api/metalakes/example/objects/table/sales.public.orders/statistics/partitions?from=dt=2026-08-01&to=dt=2026-08-31"

Drop Partition Statistics

curl -X POST -H "Accept: application/vnd.gravitino.v1+json" \
-H "Content-Type: application/json" -d '{
"drops": [
{
"partitionName": "dt=2026-08-02",
"statisticNames": ["custom.row_estimate"]
}
]
}' http://localhost:8090/api/metalakes/example/objects/table/sales.public.orders/statistics/partitions

Storage Configuration

Partition statistics use a pluggable storage backend, configured on the server. See Server Configuration below. Writing a custom backend is covered in Custom partition storage.

Server Configuration

Configuration itemDescriptionDefault valueRequired
gravitino.stats.partition.storageFactoryClassThe storage factory class for partition statistics, which is used to store partition statistics in the different storage. The org.apache.gravitino.stats.storage.MemoryPartitionStatsStorageFactory can only be used for testing.org.apache.gravitino.stats.storage.JdbcPartitionStatisticStorageFactoryNo

JDBC Storage (Default)

Starting from version 1.2.0, Gravitino uses JDBC-based storage as the default partition statistics storage backend. This provides a reliable, production-ready solution that supports multiple database backends:

  • MySQL (recommended for production)
  • PostgreSQL
  • H2 (suitable for testing and development)

To use JDBC storage, configure the following options by adding the prefix gravitino.stats.partition.storageOption.:

Configuration itemDescriptionDefault valueRequired
gravitino.stats.partition.storageOption.jdbcUrlJDBC connection URL (e.g., jdbc:mysql://localhost:3306/gravitino)NoneYes
gravitino.stats.partition.storageOption.jdbcUserDatabase usernameNoneYes
gravitino.stats.partition.storageOption.jdbcPasswordDatabase passwordNoneYes
gravitino.stats.partition.storageOption.jdbcDriverJDBC driver class namecom.mysql.cj.jdbc.DriverNo
gravitino.stats.partition.storageOption.poolMaxSizeMaximum connection pool size10No
gravitino.stats.partition.storageOption.poolMinIdleMinimum idle connections in pool2No
gravitino.stats.partition.storageOption.connectionTimeoutMsConnection timeout in milliseconds30000No
gravitino.stats.partition.storageOption.testOnBorrowTest connections before usetrueNo

Example MySQL Configuration:

gravitino.stats.partition.storageFactoryClass = org.apache.gravitino.stats.storage.JdbcPartitionStatisticStorageFactory
gravitino.stats.partition.storageOption.jdbcUrl = jdbc:mysql://localhost:3306/gravitino
gravitino.stats.partition.storageOption.jdbcUser = gravitino
gravitino.stats.partition.storageOption.jdbcPassword = gravitino123
gravitino.stats.partition.storageOption.poolMaxSize = 20

Example PostgreSQL Configuration:

gravitino.stats.partition.storageFactoryClass = org.apache.gravitino.stats.storage.JdbcPartitionStatisticStorageFactory
gravitino.stats.partition.storageOption.jdbcUrl = jdbc:postgresql://localhost:5432/gravitino
gravitino.stats.partition.storageOption.jdbcUser = gravitino
gravitino.stats.partition.storageOption.jdbcPassword = gravitino123
gravitino.stats.partition.storageOption.jdbcDriver = org.postgresql.Driver

Database Schema Setup:

Before using JDBC storage, you need to create the database schema. Schema files are provided for all supported databases:

  • MySQL: scripts/mysql/schema-${GRAVITINO_VERSION}-mysql.sql
  • PostgreSQL: scripts/postgresql/schema-${GRAVITINO_VERSION}-postgresql.sql
  • H2: scripts/h2/schema-${GRAVITINO_VERSION}-h2.sql

For MySQL:

mysql -u root -p < scripts/mysql/schema-${GRAVITINO_VERSION}-mysql.sql

For PostgreSQL:

psql -U postgres -d gravitino -f scripts/postgresql/schema-${GRAVITINO_VERSION}-postgresql.sql

Lance Storage (Alternative)

If you use Lance as the partition statistics storage, you can set the options below, if you have other lance storage options, you can pass it by adding prefix gravitino.stats.partition.storageOption.. For example, if you set an extra property foo to bar for Lance storage option, you can add a configuration item gravitino.stats.partition.storageOption.foo with value bar.

For Lance remote storage, you can refer to the document here.

Configuration itemDescriptionDefault valueRequired
gravitino.stats.partition.storageOption.locationThe location of Lance files${GRAVITINO_HOME}/data/lanceNo
gravitino.stats.partition.storageOption.maxRowsPerFileThe maximum rows per file1000000No
gravitino.stats.partition.storageOption.maxBytesPerFileThe maximum bytes per file104857600No
gravitino.stats.partition.storageOption.maxRowsPerGroupThe maximum rows per group1000000No
gravitino.stats.partition.storageOption.readBatchSizeThe batch record number when reading10000No
gravitino.stats.partition.storageOption.datasetCacheSizesize of dataset cache for Lance0, It means we don't use the cacheNo
gravitino.stats.partition.storageOption.metadataFileCacheSizeBytesThe Lance's metadata file cache size102400No
gravitino.stats.partition.storageOption.indexCacheSizeBytesThe Lance's index cache size102400No
gravitino.stats.partition.storageOption.maxStatisticsPerUpdateMaximum number of statistics allowed per update operation100No

If you have many tables with a small number of partitions, you should set a smaller metadataFileCacheSizeBytes and indexCacheSizeBytes.

To use Lance storage, configure:

gravitino.stats.partition.storageFactoryClass = org.apache.gravitino.stats.storage.LancePartitionStatisticStorageFactory
gravitino.stats.partition.storageOption.location = /data/lance