Skip to content
pg_lake_iceberg

pg_lake_iceberg

pg_lake : Iceberg implementation in Postgres

Overview

ID Extension Package Version Category License Language
2565
pg_lake_iceberg
pg_lake
3.4
OLAP
Apache-2.0
C
Attribute Has Binary Has Library Need Load Has DDL Relocatable Trusted
--s-d--
No
Yes
No
Yes
no
no
Relationships
Schemas lake_iceberg pg_catalog
Requires
pg_lake_engine
plpgsql
Need By
pg_lake_copy
pg_lake_table
Siblings
pg_lake
pg_extension_base
pg_extension_updater
pg_map
pg_lake_engine
pg_lake_table
pg_lake_copy

The control file declares pg_lake_engine; canonical metadata also retains plpgsql because the install SQL uses PL/pgSQL. plpgsql is installed by default in normal PostgreSQL databases.

Extension SQL/control version is 3.4; source and DEB/RPM package version is 3.4.0.

Packages

Type Repo Version PG Major Compatibility Package Pattern Dependencies
EXT
PIGSTY
3.4
18
17
16
15
14
pg_lake pg_lake_engine, plpgsql
RPM
PIGSTY
3.4.0
18
17
16
15
14
pg_lake_$v -
DEB
PIGSTY
3.4.0
18
17
16
15
14
postgresql-$v-pg-lake -
Linux / PG PG18 PG17 PG16 PG15 PG14
el8.x86_64
N/A
N/A
N/A
N/A
N/A
el8.aarch64
N/A
N/A
N/A
N/A
N/A
el9.x86_64
PIGSTY 3.4.0
PIGSTY 3.4.0
PIGSTY 3.4.0
N/A
N/A
el9.aarch64
PIGSTY 3.4.0
PIGSTY 3.4.0
PIGSTY 3.4.0
N/A
N/A
el10.x86_64
PIGSTY 3.4.0
PIGSTY 3.4.0
PIGSTY 3.4.0
N/A
N/A
el10.aarch64
PIGSTY 3.4.0
PIGSTY 3.4.0
PIGSTY 3.4.0
N/A
N/A
d12.x86_64
PIGSTY 3.4.0
PIGSTY 3.4.0
PIGSTY 3.4.0
N/A
N/A
d12.aarch64
PIGSTY 3.4.0
PIGSTY 3.4.0
PIGSTY 3.4.0
N/A
N/A
d13.x86_64
PIGSTY 3.4.0
PIGSTY 3.4.0
PIGSTY 3.4.0
N/A
N/A
d13.aarch64
PIGSTY 3.4.0
PIGSTY 3.4.0
PIGSTY 3.4.0
N/A
N/A
u22.x86_64
PIGSTY 3.4.0
PIGSTY 3.4.0
PIGSTY 3.4.0
N/A
N/A
u22.aarch64
PIGSTY 3.4.0
PIGSTY 3.4.0
PIGSTY 3.4.0
N/A
N/A
u24.x86_64
PIGSTY 3.4.0
PIGSTY 3.4.0
PIGSTY 3.4.0
N/A
N/A
u24.aarch64
PIGSTY 3.4.0
PIGSTY 3.4.0
PIGSTY 3.4.0
N/A
N/A
u26.x86_64
PIGSTY 3.4.0
PIGSTY 3.4.0
PIGSTY 3.4.0
N/A
N/A
u26.aarch64
PIGSTY 3.4.0
PIGSTY 3.4.0
PIGSTY 3.4.0
N/A
N/A

Source

pig build pkg pg_lake;		# build rpm/deb

Install

Make sure PGDG and PIGSTY repo available:

pig repo add pgsql -u   # add both repo and update cache

Install this extension with pig:

pig install pg_lake;		# install via package name, for the active PG version
pig install pg_lake_iceberg;		# install by extension name, for the current active PG version

pig install pg_lake_iceberg -v 18;   # install for PG 18
pig install pg_lake_iceberg -v 17;   # install for PG 17
pig install pg_lake_iceberg -v 16;   # install for PG 16

Create this extension with:

CREATE EXTENSION pg_lake_iceberg CASCADE; -- requires pg_lake_engine, plpgsql

Usage

Sources:

pg_lake_iceberg implements Iceberg metadata, snapshots, manifests, partition specifications, and catalog integration inside PostgreSQL. The familiar CREATE TABLE ... USING iceberg syntax is exposed by the dependent pg_lake_table component; users normally install both through pg_lake.

Create and Inspect an Iceberg Table

CREATE EXTENSION pg_lake CASCADE;

SET pg_lake_iceberg.default_location_prefix =
    's3://analytics-bucket/warehouse';

CREATE TABLE events (
    event_time timestamptz NOT NULL,
    user_id bigint NOT NULL,
    payload jsonb
) USING iceberg
WITH (partition_by = 'day(event_time), bucket(32, user_id)');

SELECT table_namespace, table_name, metadata_location
FROM iceberg_tables
WHERE table_name = 'events';

Inspect an Iceberg metadata file and its referenced state:

SELECT lake_iceberg.metadata(metadata_location)
FROM iceberg_tables
WHERE table_name = 'events';

SELECT f.*
FROM iceberg_tables AS t
CROSS JOIN LATERAL lake_iceberg.files(t.metadata_location) AS f
WHERE t.table_name = 'events';

Metadata and Catalog API

  • iceberg_tables: pg_catalog view combining local managed tables and external catalog entries.
  • iceberg_namespace_properties: catalog namespace properties.
  • lake_iceberg.metadata(uri): raw Iceberg metadata JSON.
  • lake_iceberg.files(uri): manifest path, content kind, data-file path/format, spec ID, record count, and file size.
  • lake_iceberg.snapshots(uri): sequence number, snapshot ID, timestamp, and manifest-list path.
  • lake_iceberg.data_file_stats(uri): per-file sequence and lower/upper bounds; execution is granted to lake_read rather than PUBLIC.
  • iceberg_catalog: version 3.4 FDW for named PostgreSQL, object-store, or REST catalog configurations.

Define a user-managed REST catalog server and keep credentials in a user mapping:

CREATE SERVER my_polaris TYPE 'rest'
FOREIGN DATA WRAPPER iceberg_catalog
OPTIONS (rest_endpoint 'https://polaris.example.com');

CREATE USER MAPPING FOR app_role SERVER my_polaris
OPTIONS (client_id 'app', client_secret 'secret');

CREATE TABLE catalog_events (id bigint)
USING iceberg
WITH (catalog = 'my_polaris');

Catalog and Storage Caveats

  • User-created catalog servers require their own USER MAPPING credentials and do not fall back to the built-in REST catalog credential GUCs.
  • The built-in postgres, object_store, and rest catalogs map to immutable extension-owned servers. Configure them through the documented GUCs rather than altering those servers.
  • External modifications to iceberg_tables are blocked by default because changing metadata behind pg_lake can break transaction and query-engine consistency.
  • Iceberg writes should be batched. Each statement can add Parquet files and snapshots; regular VACUUM compacts small files and expires data according to table/GUC policy.
  • Iceberg has narrower representations for some PostgreSQL values. The default out_of_range_values = 'error' preserves integrity; clamp silently changes out-of-range temporal values and replaces some unsupported values with NULL.
Last updated on