A tool for comparing large datasets using DuckDB
Project description
____ _ _ _
| _ \ ___| | |_ __ _| | ___ _ __ ___
| | | |/ _ \ | __/ _` | | / _ \ '_ \/ __|
| |_| | __/ | || (_| | |__| __/ | | \__ \
|____/ \___|_|\__\__,_|_____\___|_| |_|___/
DeltaLens - Data Comparison Tool
DeltaLens is a powerful tool for comparing large datasets using the power of DuckDB as the comparison engine. It supports data transformations, automated field-level matching, and detailed comparison reporting.
flowchart LR
Old_System:::external@{ shape: lin-cyl, label: "Old System" }
New_System:::external@{ shape: lin-cyl, label: "New System" }
Data_puller:::external@{ shape: subproc, label: "Data Exporter" }
Old_System-->Data_puller
New_System-->Data_puller
Data_puller-->Trades_1
Data_puller-->Trades_2
Trades_1:::external@{ shape: doc, label: "new_system_trades.csv" }
Trades_2:::external@{ shape: doc, label: "lagecy_system_trades.csv" }
Config@{ shape: doc, label: "config.json" }
Config-->TableQueryGenerator
Trades_2 -->|load|DuckDB
Trades_1 -->|load|DuckDB
subgraph DeltaLens.py
TableQueryGenerator@{ shape: subproc, label: "QueryGenerator" }
TableQueryGenerator-->|generate compare queries|DuckDB
DuckDB@{ shape: lin-cyl, label: "DuckDB" }
DuckDB-->Exporter
Exporter@{ shape: subproc, label: "Exporter" }
end
Exporter-->|export|Sqlite
Exporter-->|export|Results_csv
Sqlite@{ shape: lin-cyl, label: "results.sqlite" }
Results_csv@{ shape: doc, label: "results.csv" }
classDef external fill:#F8F8F8
Features
- Compare CSV datasets with configurable primary keys
- Apply SQL transformations to data before comparison
- Generate detailed field-level match statistics
- Export results to SQLite and CSV for analysis
- Support for larger than memory datasets
- Support for reference datasets
- Docker support for containerized execution
- CLI and Python API interfaces
- Data Pipeline and CI/CD friendly
Installation
Install from PyPI:
pip install delta-lens
see data_compare_legislators.ipynb for example.
Basic Usage
Command Line Interface
# Basic comparison
deltalens --config data/compare.config.json --run-name daily_compare
# Full options
deltalens \
--config data/compare.config.json \
--run-name daily_compare \
--output-dir ./results \
--persistent \
--continue-on-error \
--export-sqlite \
--export-csv \
--export-sampling-threshold 5000 \
--export-mismatches-only \
--log-level DEBUG
Or Pull the Docker image:
docker run unclepaul84/deltalens:latest
Using DeltaLens in Jupyter Notebooks
DeltaLens can be used interactively in Jupyter notebooks for data comparison analysis. See data_compare_legislators.ipynb
Configuration
Create a compare.config.json file:
{
"defaults":{},
"entities": [
{
"entityName":"trade",
"leftSide": {
"title": "legacy",
"inputFile":"data/legacy_system_trades.csv"
},
"rightSide": {
"title": "new",
"inputFile":"data/new_system_trades.csv"
},
"primaryKeys": ["trade_id"]
}
]
}
Environment Variables
| Variable | Description | Default |
|---|---|---|
DELTALENS_CONFIG |
Path to config file | compare.config.json |
DELTALENS_RUN_NAME |
Name for comparison run | compare_YYYY-MM-DD |
DELTALENS_OUTPUT_DIR |
Output directory | . |
DELTALENS_PERSISTENT |
Use persistent storage | false |
DELTALENS_EXPORT_SQLITE |
Export to SQLite | true |
DELTALENS_EXPORT_SAMPLING_THRESHOLD |
rowcount at which to start sampling | 10000 |
DELTALENS_EXPORT_CSV |
export to gzipped csv | true |
DELTALENS_EXPORT_MISMATCHES_ONLY |
Export mismatched rows only | true |
Output Files
The tool generates several output files:
[run_name].duckdb: DuckDB database with comparison results (if persistent mode enabled)[run_name].sqlite: SQLite export of comparison results (if enabled)
Resulting Tables include:
entity_compare_results: Overall comparison summary[entity]_compare: Detailed record-level comparison[entity]_compare_field_summary: Field-level match statistics
Development
Docker
# Run with docker-compose
docker-compose up
# Run with custom arguments
docker-compose run deltalens --run-name custom_run --log-level DEBUG
Generating Sample Data
DeltaLens includes a script to generate sample trade data for testing and demonstration purposes.
Sample Data Generator
The script creates two CSV files with randomized trade data:
legacy_system_trades.csv: Original trade data with modificationsnew_system_trades.csv: Copy of original data with known differences
cd data
# Generate sample data (creates 2GB files by default)
python create_test_datasets.py
# Install development dependencies
pip install -r requirements.txt
pip install -r requirements-dev.txt
# Run tests
pytest -v
# Run tests with coverage
pytest --cov=delta_lens -v
License
MIT License
Contributing
- Fork the repository
- Create a feature branch
- Submit a pull request
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file delta_lens-0.1.10.tar.gz.
File metadata
- Download URL: delta_lens-0.1.10.tar.gz
- Upload date:
- Size: 16.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
767f743ca27ae4a57b5df54e6cced043a9d570cec59ed5cf611408b854acd156
|
|
| MD5 |
2ce1417a8615f1b131b2dda06bea9ba2
|
|
| BLAKE2b-256 |
dc30dda9114a248f5cdd917654cba7cf95c7524f99210cdb659fdf8f2441f7ca
|
File details
Details for the file delta_lens-0.1.10-py3-none-any.whl.
File metadata
- Download URL: delta_lens-0.1.10-py3-none-any.whl
- Upload date:
- Size: 16.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9d914ede8884df0fc56a350502271cec8cb69d8ae6a19c4673d7493a39fb9d0e
|
|
| MD5 |
8a472c106e9b0b3db786af8f2c561cdc
|
|
| BLAKE2b-256 |
a9de5c96a6c3cbbc52392dcd2736c34bd4c81ee8b906d575f5eaf0e6cd15f3f4
|