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 16 · Writing

Import and migration

In progressUpdated 2026-10-12View on GitHub
Versions
0.1.0
Roadmap
v0: a maintenance-free time-series table on S3, Data lifecycle, Technical preview
Related
4. Time-series table contract, 15. Backfill

Summary

import infers a table contract from a source, creates the table and loads it through the backfill engine: CSV, Parquet and Iceberg first, then TimescaleDB and Postgres with a --sync cutover, then the long tail through DuckDB. CSV and Parquet import with schema inference is built; the rest is planned.

Design

import = create (or adopt) a table + backfill.

  • backfill loads into a table that already exists.
  • import also infers the table contract from the source and creates the table. It then reuses the backfill engine (spec 15), so all its guarantees apply: final layout, branch staging, atomic publish, resumable, dry run.

The simple path

timelake import readings.csv --table iot.sensor
  1. Inspect: Sample the source and infer column types, timestamp formats, and time zones.
  2. Propose a contract:
    • Time column: from the type and column name (ts, time, timestamp, …).
    • Series key: low-cardinality string/int columns that repeat across timestamps.
    • Chunk interval: from data volume and time span.
  3. Show the proposal and an import plan: row estimate, time range, target layout, and cost.
  4. Confirm, or pass --yes for scripts. Edits can be made inline with flags.
  5. Save the plan as import.yaml. It can be edited, version-controlled, and re-run (timelake import --plan import.yaml).

Sources and their smart defaults

SourceHow it's readWhat gets auto-mapped
CSV / TSV (local, URLs, object-store globs; gzip/zstd)Streaming parser, parallel by file and byte rangeHeader → columns; timestamp format and time-zone detection; optional unpivot of wide historian exports (one column per tag → tag, ts, value)
Parquet, JSON/NDJSON, Arrow IPCNative readersSchema as-is
Register in place (Parquet already in the target layout)No copy (Iceberg add_files)Validated against the contract
Iceberg tables (S3 Tables, Glue, any REST catalog)iceberg-rustSchema, partitioning. Two options: copy + re-layout with import, or in place with adopt (spec 4)
Delta Lake, DuckLake, Hive-partitioned ParquetNative or DuckDB-backed readerSchema, partition columns
TimescaleDBParallel by hypertable chunk (natural time-range units), consistent snapshot, binary COPY → ArrowHypertable time dimension → time_column; compression segmentby → series_key; chunk_time_interval → chunk_interval; retention policy → retention. Continuous aggregate definitions are translated to Timelake rollups where the functions map; anything unmapped is reported.
PostgreSQL / MySQL / SQL ServerParallel by time-range slices, ADBC / COPYTime column from type; series key proposed
InfluxDB (v1/v2 export, v3 Flight SQL)Per measurementMeasurement → table; tags → series_key; fields → columns
ClickHouse, QuestDBNative protocol or HTTP/ArrowTime and ordering key → contract
PrometheusRemote-read APIMetric + labels → series_key
Industrial historians* (AVEVA PI, Ignition SQL historian, …)Premium connectors (license); CSV exports work in open sourceTag → series, quality → quality
Anything DuckDB can readA DuckDB SQL query as the sourceInferred from result schema

*A historian is the specialized time-series database that factories and utilities run on-site to record sensor and PLC (programmable logic controller) data. Examples: AVEVA PI (formerly OSIsoft PI), Ignition, Honeywell PHD, AspenTech IP.21. In industrial IoT, historians are the most common source of years of historical data, often exported as CSV.

Migration with cutover (database sources):

timelake import postgres://user@host/factory --hypertable public.sensor_data --table iot.sensor_data
timelake import postgres://user@host/factory --all-hypertables --namespace factory
timelake import ... --sync      # keep tailing new rows by time watermark until cutover
timelake import ... --cutover   # final catch-up, then stop
  1. A bulk historical copy (parallel, resumable).
  2. --sync keeps copying rows newer than the last watermark, so the source can stay live during migration. Late updates to old rows on the source are caught by a final range re-check before cutover.
  3. Logical-replication CDC (exact row-level changes) is a later enhancement.

Python:

lake.import_csv("s3://exports/*.csv", table="iot.sensor", time_column="ts")   # or omit for inference
lake.import_from("postgres://…/factory", hypertable="public.sensor_data", table="iot.sensor_data")

Implementation note:

  • Priority sources get native Rust readers: CSV, Parquet, Iceberg, Postgres/TimescaleDB.
  • The long tail goes through an optional DuckDB-backed source (DuckDB's scanners for MySQL, SQLite, Delta, Excel, …). It is an optional CLI feature, so the core keeps no C++ dependency (D3).

Decisions

IDDecisionStatus
D10import = contract inference + create/adopt + backfill, with smart defaults for CSV, lake formats, and databases (TimescaleDB first) (spec 16)Accepted

Open questions and issues

None open.

History

  • 2026-10-11: D10 accepted (SPEC.md §8.5); Q16 resolved
  • 2026-10-12: timelake import of CSV and Parquet built
  • 2026-10-19: moved from SPEC.md into its own spec.
  • 2026-10-19: was spec 11; specs regrouped one per feature, with milestones on the roadmap.