PROJECT CASE STUDY // TECHNICAL NARRATIVE

MessyData

Resilient Multi-Source Data Reconciliation & Tiered Entity Resolution Engine

YOUR ROLE & SCOPEData & Backend Engineer
TIMELINE4 Weeks
CORE CONSTRAINTSReconciling mismatched, dirty customer records from legacy CSV encodings and APIs without data loss.
error_outline

1. THE PROBLEM

Organizations aggregating user records across multiple legacy databases end up with duplicate, corrupted, and poorly formatted profiles that skew analytics.

account_tree

SYSTEM ARCHITECTURE & PIPELINE FLOW

4 STAGE PIPELINE
STAGE 01. EXTRACTION1

Multi-Source Extraction & Normalization

Ingests raw records from PostgreSQL, REST APIs, and varied CSV encodings into normalized data schemas.

STAGE 02. RESOLUTION2

Exact Key & RapidFuzz Similarity Matching

Executes exact key matching followed by C++ accelerated Jaro-Winkler string distance scoring.

STAGE 03. MERGING3

Golden Record Synthesis & Auto Merges

Clusters candidate profiles above 88% confidence and writes unified golden customer records.

STAGE 04. TRIAGE4

Streamlit Lineage & Manual Triage Queue

Routes borderline matches (80%-88%) to a 20-record manual triage queue with full lineage tracking.

architecture

2. TECHNICAL APPROACH & DECISIONS

1Tiered Entity Resolution Engine

✓ DECISION CHOSEN

Combined exact key matching with C++ accelerated RapidFuzz string similarity (Jaro-Winkler + Token Sort Ratio) to cluster candidate customer profiles.

✕ REJECTED ALTERNATIVE

Naive SQL LIKE pattern matching

Exact SQL matching misses human typos ('Anirudh S' vs 'Anirud S'). RapidFuzz provided C++ accelerated string distance calculations across thousands of records.

2Lineage Dashboard & Triage Queue

✓ DECISION CHOSEN

Constructed a Streamlit observability dashboard tracking pipeline execution metrics, data lineage, and a dedicated 20-record manual triage queue.

✕ REJECTED ALTERNATIVE

Silent automated merges without human verification

Borderline similarity scores (80%–88%) are safely routed to a manual triage queue, guaranteeing zero accidental merges on ambiguous records.

code

CORE ARCHITECTURAL LOGIC

pythonpipeline/entity_resolution.py

Tiered fuzzy matching engine utilizing RapidFuzz C++ algorithms for record clustering.

pipeline/entity_resolution.py
1def reconcile_customer_records(raw_records: pd.DataFrame, cutoff: float = 88.0) -> DeduplicationSummary:
2 golden_records, triage_queue = [], []
3 clustered_groups = defaultdict(list)
4
5 for idx, record in raw_records.iterrows():
6 matched = False
7 for group_id, members in clustered_groups.items():
8 # C++ accelerated RapidFuzz Token Sort & Jaro-Winkler similarity
9 score = fuzz.token_sort_ratio(record["name"], members[0]["name"])
10 if score >= cutoff:
11 members.append(record)
12 matched = True
13 break
14 if not matched:
15 clustered_groups[record["id"]].append(record)
16
17 return DeduplicationSummary(merged=len(clustered_groups), triage_count=len(triage_queue))
balance

3. TRADE-OFFS & HONEST REFLECTION

Setting conservative fuzzy matching cutoffs (88%) required maintaining a manual triage queue for edge cases, but guaranteed 100% data integrity for golden records.

task_alt

4. CONCRETE OUTCOME & METRICS

Executed 518 automatic profile merges with a dedicated 20-record manual triage queue, Streamlit lineage observability, and full CI/CD test automation in GitHub Actions.

518 Verified MergesAutomatic Profile Merges
20 Borderline RecordsManual Triage Queue
GitHub Actions CI/CDAutomated Testing
Explore Project Sources
Review live deployment or inspect codebase on GitHub.