ECHO Data Package: formats by size
Every table in a package is stored in data/ as Apache Parquet. Whether it also gets a CSV copy, a JSON Lines copy or graph files depends on its size, as below. Sizes are measured on the table itself: its number of rows and its uncompressed size. A table falls in the first band whose limits it is within.
| Band | Up to (rows) | Up to (size) | Parquet | CSV | JSON Lines | Graph TSV | GraphML |
|---|---|---|---|---|---|---|---|
| small | 1 million | 2 GB | one file | yes | text and nested tables | yes | yes |
| medium | 100 million | 50 GB | one file | yes | text and nested tables | yes | no |
| large | 1 billion | 500 GB | partitioned | partitioned | no | yes | no |
| very large | no limit | no limit | partitioned | no | no | no | no |
Graph TSV and GraphML apply to network tables (edges and nodes) only. GraphML describes a single static graph, so networks recorded as several snapshots or layers get the TSV files, which keep the snapshot and layer columns, and no GraphML.
Partitioned tables
A partitioned table is a folder of Parquet files of about 512 MB each, split by the first rule that applies:
- table has created_at: by month of created_at
- edges has layer: by layer
- table has snapshot_id: by snapshot_id
- otherwise: consecutive rows, in parts of about the target size
Parquet settings
Compression zstd (level 9), row groups of 1,000,000 rows.
When these rules change
These rules are versioned separately from the standard (this is rule set 2026.11.0). When they change, every package whose tables fall in a different band is rebuilt with the new formats as a PATCH version; the data in data/ does not change. Each package records the rule set it was built with in datapackage.json (echo:policy_version).
