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/debInstall
Make sure PGDG and PIGSTY repo available:
pig repo add pgsql -u # add both repo and update cacheInstall 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 16Create this extension with:
CREATE EXTENSION pg_lake_iceberg CASCADE; -- requires pg_lake_engine, plpgsqlUsage
Sources:
- Official Iceberg table guide
- Version 3.4 control file
- Iceberg metadata SQL API
- Version 3.4 catalog FDW SQL
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_catalogview 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 tolake_readrather thanPUBLIC.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 MAPPINGcredentials and do not fall back to the built-in REST catalog credential GUCs. - The built-in
postgres,object_store, andrestcatalogs map to immutable extension-owned servers. Configure them through the documented GUCs rather than altering those servers. - External modifications to
iceberg_tablesare 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
VACUUMcompacts 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;clampsilently changes out-of-range temporal values and replaces some unsupported values withNULL.