Timelaketimelake
DocsBenchmarksRoadmapSpecContribute
Apache 2.0 ·
Roadmap

DoneIn progressPlanned

Tables and storage

Done:1. Iceberg tablesDone:2. CommitsDone:3. Object-store catalogIn progress:4. Time-series table contractIn progress:5. File layout and encodingsIn progress:6. Last-value indexDone:7. One-request table state and version checksDone:8. Table format versions and upgradesDone:9. SettingsPlanned:10. Supplemental timestamps

Writing

Done:11. AppendsDone:12. Late data and dedup on readDone:13. Writes from WebAssemblyPlanned:14. Hot tier and seconds-fresh readsPlanned:15. BackfillIn progress:16. Import and migrationPlanned:17. DeletesPlanned:18. GDPR erasure

Maintenance

Done:19. CompactionIn progress:20. Maintenance runs, retention and expiry

Reading

In progress:21. Timelake readerDone:22. Block cacheDone:23. Filter pushdownDone:24. Pruning with long IN listsDone:25. Newest-first scansDone:26. Scans in series orderDone:27. Materialized rollups

SQL functions

In progress:28. Function libraryDone:29. Time buckets and gap fillingDone:30. Signal aggregatesDone:31. Downsampling with m4

Integrations

Planned:32. REST catalogPlanned:33. DuckDB extensionPlanned:34. Snowflake connectionPlanned:35. Multitenancy

Services

Planned:36. Ingestion and rulesPlanned:37. Data to eventsPlanned:38. Static read modelsPlanned:39. Computed metricsPlanned:40. Agent access with permission setsPlanned:41. Device syncPlanned:42. Edge gatewayPlanned:43. Server mode

Benchmarks

In progress:44. Benchmark harness: timebenchIn progress:45. Industrial IoT benchmarkPlanned:46. Agent benchmark

Background

ArchitectureDeployment and cost modelEmbedded engine: DataFusionLandscape and positioningLicense and open corePurpose and requirementsReleases
TimelaketimelakeThe open time-series lakehouse.
v0 · Apache 2.0 · Contribute · GitHubBuilt on Apache Arrow, Apache DataFusion, Apache Parquet, and Apache Iceberg.
DocsBenchmarksRoadmapSpecContribute

Spec 4 · Tables and storage

Time-series table contract

In progressUpdated 2026-10-18View on GitHub
Versions
0.1.0, 0.5.0
Roadmap
v0: a maintenance-free time-series table on S3, Data lifecycle, Technical preview
Related
5. File layout and encodings, 9. Settings, 10. Supplemental timestamps, 12. Late data and dedup on read

Summary

Users define their own schema; a table becomes a Timelake table by declaring a time column and, optionally, a series key, dedup and a chunk interval, stored as timelake.* table properties. The contract drives the layout, dedup, retention and rollups. Creating tables with a contract is built; adopting existing Iceberg tables is planned.

Design

Timelake tables: a time-series table contract (D5)

ElementRequired?Meaning
time_columnRequired, exactly onetimestamp / timestamptz (µs; ns on Iceberg v3). Drives partitioning, retention, rollups, late-data detection.
series_keyOptional (strongly recommended)One or more columns identifying a series, e.g. (device_id, metric). Drives sort order, dedup, series indexes, bucket partitioning. If absent, the table is treated as a single stream (e.g. an event log).
dedup_keyOptionalDefaults to series_key + time_column. Set to none to disable dedup.
chunk_intervalOptionalTime partition granularity. Auto-chosen from expected volume if omitted.
_ingest_tsAdded automatically (opt-out)Insertion time, set by the writer per append (built 2026-10-16, table format 0.3.0, spec 12). Decides which copy of a row is the latest write; powers late-data detection and freshness metrics.
Supplemental time columnsOptionalOther times a sample carries (server, gateway, sent, corrected), declared so Timelake understands them (spec 10, proposed).
All other columnsFree-formAny Iceberg type, including variant on v3. Evolves via Iceberg schema evolution (add / rename / widen / drop).

Tables without a time column (dimensions, e.g. device metadata) are allowed. The contract's elements are settings fixed at creation (spec 9); setting them later as properties is an error.

Creating a table:

CREATE TABLE iot.sensor (
  device_id STRING, metric STRING, ts TIMESTAMPTZ,
  value DOUBLE, quality SMALLINT
) WITH (time_column = 'ts', series_key = ('device_id', 'metric'), chunk_interval = '1 day');
lake.create_table("iot.sensor", schema=arrow_schema,
                  time_column="ts", series_key=["device_id", "metric"])

Adopting existing tables (planned, #130): timelake adopt <table> turns an existing Iceberg table (e.g. one in S3 Tables) into a Timelake table. It validates the contract, sets timelake.* properties, and lets compaction gradually re-lay out the data. This is the main migration path from "S3 Tables + Glue".

Internal series ID: Timelake computes a stable 64-bit hash of series_key for indexing and bucketing, kept in indexes only, not as a column (Q4, decided 2026-10-18: a hidden _series_id column was measured and decided against, spec 24).

Documented schema templates (not mandatory)

TemplateExample schemaBest for
Narrowdevice_id, metric, ts, value, qualityHeterogeneous devices, thousands of metric types, sparse data
Widedevice_id, ts, temp, pressure, rpm, …Homogeneous fleets, metrics sampled together
Eventdevice_id, ts, event_type, payload (variant/JSON)Alarms, state changes, logs
Series metadata (dimension)device_id, site, asset_type, unit, firmware, …Tags kept out of the hot table and joined at query time

IoT tip: include a quality column (OPC-UA-style good/uncertain/bad flag). It is common in industrial data and supported by the function library.

Decisions

IDDecisionStatus
D5User-defined schemas with a time-series table contractAccepted

Open questions and issues

  • #130 timelake adopt: turn an existing Iceberg table into a Timelake table

History

  • 2026-10-11: contract and templates (SPEC.md §7)
  • 2026-10-12: built in v0
  • 2026-10-16: _ingest_ts (table format 0.3.0)
  • 2026-10-18: internal series ID decided (Q4)
  • 2026-10-19: moved from SPEC.md into spec 6, then into this spec when the specs were regrouped one per feature.