<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Unmasking the Connected Consumer in Community Articles</title>
    <link>https://community.databricks.com/t5/community-articles/unmasking-the-connected-consumer/m-p/169161#M1579</link>
    <description>&lt;P&gt;&lt;FONT face="georgia,palatino" size="3" color="#333333"&gt;&lt;SPAN&gt;Behind every clean “Golden Record” is a messy web of shared emails, phones, and legacy IDs. Here’s how we turned that web into an interactive, cluster-aware graph a data steward can actually work with — built on Streamlit, NetworkX, and a Databricks SQL Warehouse.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;In the world of Master Data Management, the “Single View of the Customer” is the holy grail. But behind every clean Golden Record lies a messy web of raw data: five different email addresses, shared phone numbers, and legacy system IDs that may or may not belong to the same person.&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;Identifying these links is&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;identity resolution&lt;/STRONG&gt;. Visualizing them, however, is where the real insights happen — and where we built the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;Entity Linkage Explorer&lt;/STRONG&gt;: a Streamlit app that lets data stewards traverse identity clusters, isolate specific data “islands,” and filter out noisy attributes in real time, all against a live Databricks SQL Warehouse.&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="KeerthiItigimat_0-1789796005971.png" style="width: 999px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/31308i0343E10EC800A777/image-size/large?v=v2&amp;amp;px=999" role="button" title="KeerthiItigimat_0-1789796005971.png" alt="KeerthiItigimat_0-1789796005971.png" /&gt;&lt;/span&gt;&lt;FONT face="georgia,palatino" color="#808080"&gt;&lt;STRONG&gt;Figure 1.&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;The Entity Linkage Explorer running as a Databricks App — the sidebar drives what the graph shows; the canvas renders only the clusters the steward has toggled on.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;H2&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;&lt;SPAN class=""&gt;&lt;FONT size="3"&gt;01&lt;/FONT&gt;&lt;BR /&gt;&lt;/SPAN&gt;From tables to topology&lt;/FONT&gt;&lt;/H2&gt;&lt;P&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;Traditional data quality tools give you a table. But tables are terrible at showing&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;transitive relationships&lt;/STRONG&gt;. If Person A shares an email with Person B, and Person B shares a phone number with Person C, a table makes it hard to see that all three might be the same household.&lt;/FONT&gt;&lt;/P&gt;&lt;DIV class=""&gt;&lt;P&gt;&lt;FONT size="4" color="#008000"&gt;&lt;EM&gt;&lt;FONT face="georgia,palatino"&gt;Tables show rows. They don’t show the shape of a relationship.&lt;/FONT&gt;&lt;/EM&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;FONT face="georgia,palatino" size="4" color="#333333"&gt;&lt;SPAN class=""&gt;The core problem&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;P&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;We needed a tool that could:&lt;/FONT&gt;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;&lt;STRONG&gt;Query scale.&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;Pull deep lineage from a Databricks SQL Warehouse without dragging the whole table across the wire.&lt;/FONT&gt;&lt;/LI&gt;&lt;LI&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;&lt;STRONG&gt;Identify clusters.&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;Automatically group connected individuals into “islands.”&lt;/FONT&gt;&lt;/LI&gt;&lt;LI&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;&lt;STRONG&gt;Handle noise.&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;Dynamically exclude junk data —&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;test@test.com,&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;123 Main St&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;— that causes false links.&lt;/FONT&gt;&lt;/LI&gt;&lt;LI&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;&lt;STRONG&gt;Perform.&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;Render hundreds of nodes without crashing the browser.&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;H2&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;&lt;SPAN class=""&gt;&lt;FONT size="3"&gt;02&lt;/FONT&gt;&lt;BR /&gt;&lt;/SPAN&gt;A four-tier, graph-first architecture&lt;/FONT&gt;&lt;/H2&gt;&lt;P&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;The app separates security, data, logic, and rendering into their own tiers — each one only doing the job it’s good at.&lt;/FONT&gt;&lt;/P&gt;&lt;DIV class=""&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="KeerthiItigimat_1-1789796189053.png" style="width: 999px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/31309iC01E2D30130F2C51/image-size/large?v=v2&amp;amp;px=999" role="button" title="KeerthiItigimat_1-1789796189053.png" alt="KeerthiItigimat_1-1789796189053.png" /&gt;&lt;/span&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;FONT color="#FF6600"&gt;&lt;FONT color="#808080"&gt;&lt;STRONG&gt;&lt;FONT color="#808080"&gt;Figure&lt;/FONT&gt; &lt;FONT color="#808080"&gt;2.&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT color="#808080"&gt;The app captures the user’s OBO token to establish a secure session, pulls only the columns needed for linking, builds a logical graph with NetworkX, then hands it to PyVis to render&lt;/FONT&gt;.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;&lt;P&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;To keep the data tier fast, we avoid&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;SELECT *&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;and pull only the attributes necessary for linking. Before drawing anything, we build a logical graph in&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;NetworkX&lt;/STRONG&gt;: every person and every attribute — an email, a phone number, an address — becomes a node, and a shared attribute becomes an edge between the people who share it. Running&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;Connected Components&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;over that graph instantly identifies every isolated cluster in the dataset, no matter how many hops apart the shared attribute is.&lt;/FONT&gt;&lt;/P&gt;&lt;H2&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;&lt;SPAN class=""&gt;&lt;FONT size="3"&gt;03&lt;/FONT&gt;&lt;BR /&gt;&lt;/SPAN&gt;Cluster filtering tames the hairball&lt;/FONT&gt;&lt;/H2&gt;&lt;P&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;One of the biggest pain points in graph visualization is the “hairball effect” — too many nodes create an unreadable mess. So the app never renders anything until the user has chosen what to look at.&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;Connected components are computed once, then listed in the sidebar as named, countable clusters:&lt;BR /&gt;&lt;BR /&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;DIV class=""&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="KeerthiItigimat_2-1789796376244.png" style="width: 609px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/31310iF32292DDBE5D18A5/image-dimensions/609x57?v=v2" width="609" height="57" role="button" title="KeerthiItigimat_2-1789796376244.png" alt="KeerthiItigimat_2-1789796376244.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Users toggle clusters on or off, and only the visible nodes are ever handed to PyVis. If a specific email address is stitching together two families that shouldn’t be linked, the steward can see exactly which cluster it sits in and reach for the&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;Unlink / Exclude&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;feature to remove it — without touching anyone else’s view.&lt;/SPAN&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="KeerthiItigimat_3-1789796441733.png" style="width: 999px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/31311iB192582D7C1DBD60/image-size/large?v=v2&amp;amp;px=999" role="button" title="KeerthiItigimat_3-1789796441733.png" alt="KeerthiItigimat_3-1789796441733.png" /&gt;&lt;/span&gt;&lt;/DIV&gt;&lt;P&gt;&lt;FONT face="georgia,palatino" color="#808080"&gt;&lt;STRONG&gt;Figure 3.&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;Excluding one bad phone number splits a falsely merged household into two correct clusters — the exact “What-If” check a data steward runs before trusting a linkage.&lt;/FONT&gt;&lt;/P&gt;&lt;H2&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;&lt;SPAN class=""&gt;&lt;FONT size="3"&gt;04&lt;/FONT&gt;&lt;BR /&gt;&lt;/SPAN&gt;Engineering for performance&lt;/FONT&gt;&lt;/H2&gt;&lt;P&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;Thousands of identity links can turn naive Python loops into the bottleneck. Three specific optimizations keep the UI snappy.&lt;/FONT&gt;&lt;/P&gt;&lt;H3&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;itertuples() instead of iterrows()&lt;/FONT&gt;&lt;/H3&gt;&lt;P&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;iterrows()&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;is notoriously slow because Pandas builds a fresh&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;Series&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;for every row. Switching to&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;itertuples()&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;improved graph-building speed by nearly&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;50x&lt;/STRONG&gt;, processing thousands of links in milliseconds.&lt;/FONT&gt;&lt;/P&gt;&lt;H3&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;Two-layer caching&lt;/FONT&gt;&lt;/H3&gt;&lt;P&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;Streamlit’s&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;a href="https://community.databricks.com/t5/user/viewprofilepage/user-id/12028"&gt;@ST&lt;/a&gt;.cache_data&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;is split into two layers: a&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;data cache&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;for the raw SQL results, and a&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;graph cache&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;for the NetworkX object itself. Changing a purely visual setting — background color, node size — redraws the existing graph instead of re-querying Databricks or reprocessing the DataFrame.&lt;/FONT&gt;&lt;/P&gt;&lt;H3&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;Physics stabilization&lt;/FONT&gt;&lt;/H3&gt;&lt;P&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;Graph simulations are CPU-intensive. Configuring PyVis’s&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;forceAtlas2Based&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;solver with a high stabilization threshold lets the layout settle&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;EM&gt;before&lt;/EM&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;render, instead of animating a bouncing simulation that freezes the browser on large loads.&lt;/FONT&gt;&lt;/P&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;STRONG&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;pyvis network options&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;PRE&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;net.set_options(&lt;SPAN class=""&gt;"""&lt;/SPAN&gt;
&lt;SPAN class=""&gt;{&lt;/SPAN&gt;
&lt;SPAN class=""&gt;  "physics": {&lt;/SPAN&gt;
&lt;SPAN class=""&gt;    "solver": "forceAtlas2Based",&lt;/SPAN&gt;
&lt;SPAN class=""&gt;    "stabilization": {"iterations": 150}&lt;/SPAN&gt;
&lt;SPAN class=""&gt;  }&lt;/SPAN&gt;
&lt;SPAN class=""&gt;}&lt;/SPAN&gt;
&lt;SPAN class=""&gt;"""&lt;/SPAN&gt;)&lt;/FONT&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;H2&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;&lt;SPAN class=""&gt;&lt;FONT size="3"&gt;05&lt;/FONT&gt;&lt;BR /&gt;&lt;/SPAN&gt;Handling data quality on the fly&lt;/FONT&gt;&lt;/H2&gt;&lt;P&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;Data is rarely perfect. A generic placeholder like&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;NA&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;or a shared “house” phone number will link thousands of unrelated people together if you let it. The Explorer includes a&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;Dynamic Exclusion&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;engine: type any value into a “Values to Remove” box, and the app instantly:&lt;/FONT&gt;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;Drops those nodes from the NetworkX graph.&lt;/FONT&gt;&lt;/LI&gt;&lt;LI&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;Recalculates the clusters.&lt;/FONT&gt;&lt;/LI&gt;&lt;LI&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;Redraws the now-cleaned visualization.&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;DIV class=""&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="KeerthiItigimat_5-1789796578733.png" style="width: 777px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/31313iAB0028D12813764D/image-dimensions/777x169?v=v2" width="777" height="169" role="button" title="KeerthiItigimat_5-1789796578733.png" alt="KeerthiItigimat_5-1789796578733.png" /&gt;&lt;/span&gt;&lt;/DIV&gt;&lt;P&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;This is the point of the whole tool: entity linkage isn’t just an algorithm, it’s human-in-the-loop verification. NetworkX supplies the analytical power; Streamlit supplies the rapid UI. Together they turn a static lineage report into something relationships can be explored, cleaned, and understood at a glance.&lt;/FONT&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;STRONG&gt;&lt;FONT face="georgia,palatino" size="4" color="#008000"&gt;Better data quality. Fewer duplicate customers. A much clearer picture of who&lt;BR /&gt;your consumers actually are.&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;</description>
    <pubDate>Sat, 19 Sep 2026 05:47:08 GMT</pubDate>
    <dc:creator>KeerthiItigimat</dc:creator>
    <dc:date>2026-09-19T05:47:08Z</dc:date>
    <item>
      <title>Unmasking the Connected Consumer</title>
      <link>https://community.databricks.com/t5/community-articles/unmasking-the-connected-consumer/m-p/169161#M1579</link>
      <description>&lt;P&gt;&lt;FONT face="georgia,palatino" size="3" color="#333333"&gt;&lt;SPAN&gt;Behind every clean “Golden Record” is a messy web of shared emails, phones, and legacy IDs. Here’s how we turned that web into an interactive, cluster-aware graph a data steward can actually work with — built on Streamlit, NetworkX, and a Databricks SQL Warehouse.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;In the world of Master Data Management, the “Single View of the Customer” is the holy grail. But behind every clean Golden Record lies a messy web of raw data: five different email addresses, shared phone numbers, and legacy system IDs that may or may not belong to the same person.&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;Identifying these links is&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;identity resolution&lt;/STRONG&gt;. Visualizing them, however, is where the real insights happen — and where we built the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;Entity Linkage Explorer&lt;/STRONG&gt;: a Streamlit app that lets data stewards traverse identity clusters, isolate specific data “islands,” and filter out noisy attributes in real time, all against a live Databricks SQL Warehouse.&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="KeerthiItigimat_0-1789796005971.png" style="width: 999px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/31308i0343E10EC800A777/image-size/large?v=v2&amp;amp;px=999" role="button" title="KeerthiItigimat_0-1789796005971.png" alt="KeerthiItigimat_0-1789796005971.png" /&gt;&lt;/span&gt;&lt;FONT face="georgia,palatino" color="#808080"&gt;&lt;STRONG&gt;Figure 1.&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;The Entity Linkage Explorer running as a Databricks App — the sidebar drives what the graph shows; the canvas renders only the clusters the steward has toggled on.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;H2&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;&lt;SPAN class=""&gt;&lt;FONT size="3"&gt;01&lt;/FONT&gt;&lt;BR /&gt;&lt;/SPAN&gt;From tables to topology&lt;/FONT&gt;&lt;/H2&gt;&lt;P&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;Traditional data quality tools give you a table. But tables are terrible at showing&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;transitive relationships&lt;/STRONG&gt;. If Person A shares an email with Person B, and Person B shares a phone number with Person C, a table makes it hard to see that all three might be the same household.&lt;/FONT&gt;&lt;/P&gt;&lt;DIV class=""&gt;&lt;P&gt;&lt;FONT size="4" color="#008000"&gt;&lt;EM&gt;&lt;FONT face="georgia,palatino"&gt;Tables show rows. They don’t show the shape of a relationship.&lt;/FONT&gt;&lt;/EM&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;FONT face="georgia,palatino" size="4" color="#333333"&gt;&lt;SPAN class=""&gt;The core problem&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;P&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;We needed a tool that could:&lt;/FONT&gt;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;&lt;STRONG&gt;Query scale.&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;Pull deep lineage from a Databricks SQL Warehouse without dragging the whole table across the wire.&lt;/FONT&gt;&lt;/LI&gt;&lt;LI&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;&lt;STRONG&gt;Identify clusters.&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;Automatically group connected individuals into “islands.”&lt;/FONT&gt;&lt;/LI&gt;&lt;LI&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;&lt;STRONG&gt;Handle noise.&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;Dynamically exclude junk data —&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;test@test.com,&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;123 Main St&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;— that causes false links.&lt;/FONT&gt;&lt;/LI&gt;&lt;LI&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;&lt;STRONG&gt;Perform.&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;Render hundreds of nodes without crashing the browser.&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;H2&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;&lt;SPAN class=""&gt;&lt;FONT size="3"&gt;02&lt;/FONT&gt;&lt;BR /&gt;&lt;/SPAN&gt;A four-tier, graph-first architecture&lt;/FONT&gt;&lt;/H2&gt;&lt;P&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;The app separates security, data, logic, and rendering into their own tiers — each one only doing the job it’s good at.&lt;/FONT&gt;&lt;/P&gt;&lt;DIV class=""&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="KeerthiItigimat_1-1789796189053.png" style="width: 999px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/31309iC01E2D30130F2C51/image-size/large?v=v2&amp;amp;px=999" role="button" title="KeerthiItigimat_1-1789796189053.png" alt="KeerthiItigimat_1-1789796189053.png" /&gt;&lt;/span&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;FONT color="#FF6600"&gt;&lt;FONT color="#808080"&gt;&lt;STRONG&gt;&lt;FONT color="#808080"&gt;Figure&lt;/FONT&gt; &lt;FONT color="#808080"&gt;2.&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT color="#808080"&gt;The app captures the user’s OBO token to establish a secure session, pulls only the columns needed for linking, builds a logical graph with NetworkX, then hands it to PyVis to render&lt;/FONT&gt;.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;&lt;P&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;To keep the data tier fast, we avoid&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;SELECT *&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;and pull only the attributes necessary for linking. Before drawing anything, we build a logical graph in&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;NetworkX&lt;/STRONG&gt;: every person and every attribute — an email, a phone number, an address — becomes a node, and a shared attribute becomes an edge between the people who share it. Running&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;Connected Components&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;over that graph instantly identifies every isolated cluster in the dataset, no matter how many hops apart the shared attribute is.&lt;/FONT&gt;&lt;/P&gt;&lt;H2&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;&lt;SPAN class=""&gt;&lt;FONT size="3"&gt;03&lt;/FONT&gt;&lt;BR /&gt;&lt;/SPAN&gt;Cluster filtering tames the hairball&lt;/FONT&gt;&lt;/H2&gt;&lt;P&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;One of the biggest pain points in graph visualization is the “hairball effect” — too many nodes create an unreadable mess. So the app never renders anything until the user has chosen what to look at.&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;Connected components are computed once, then listed in the sidebar as named, countable clusters:&lt;BR /&gt;&lt;BR /&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;DIV class=""&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="KeerthiItigimat_2-1789796376244.png" style="width: 609px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/31310iF32292DDBE5D18A5/image-dimensions/609x57?v=v2" width="609" height="57" role="button" title="KeerthiItigimat_2-1789796376244.png" alt="KeerthiItigimat_2-1789796376244.png" /&gt;&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Users toggle clusters on or off, and only the visible nodes are ever handed to PyVis. If a specific email address is stitching together two families that shouldn’t be linked, the steward can see exactly which cluster it sits in and reach for the&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;Unlink / Exclude&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;feature to remove it — without touching anyone else’s view.&lt;/SPAN&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="KeerthiItigimat_3-1789796441733.png" style="width: 999px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/31311iB192582D7C1DBD60/image-size/large?v=v2&amp;amp;px=999" role="button" title="KeerthiItigimat_3-1789796441733.png" alt="KeerthiItigimat_3-1789796441733.png" /&gt;&lt;/span&gt;&lt;/DIV&gt;&lt;P&gt;&lt;FONT face="georgia,palatino" color="#808080"&gt;&lt;STRONG&gt;Figure 3.&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;Excluding one bad phone number splits a falsely merged household into two correct clusters — the exact “What-If” check a data steward runs before trusting a linkage.&lt;/FONT&gt;&lt;/P&gt;&lt;H2&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;&lt;SPAN class=""&gt;&lt;FONT size="3"&gt;04&lt;/FONT&gt;&lt;BR /&gt;&lt;/SPAN&gt;Engineering for performance&lt;/FONT&gt;&lt;/H2&gt;&lt;P&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;Thousands of identity links can turn naive Python loops into the bottleneck. Three specific optimizations keep the UI snappy.&lt;/FONT&gt;&lt;/P&gt;&lt;H3&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;itertuples() instead of iterrows()&lt;/FONT&gt;&lt;/H3&gt;&lt;P&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;iterrows()&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;is notoriously slow because Pandas builds a fresh&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;Series&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;for every row. Switching to&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;itertuples()&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;improved graph-building speed by nearly&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;50x&lt;/STRONG&gt;, processing thousands of links in milliseconds.&lt;/FONT&gt;&lt;/P&gt;&lt;H3&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;Two-layer caching&lt;/FONT&gt;&lt;/H3&gt;&lt;P&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;Streamlit’s&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;a href="https://community.databricks.com/t5/user/viewprofilepage/user-id/12028"&gt;@ST&lt;/a&gt;.cache_data&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;is split into two layers: a&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;data cache&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;for the raw SQL results, and a&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;graph cache&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;for the NetworkX object itself. Changing a purely visual setting — background color, node size — redraws the existing graph instead of re-querying Databricks or reprocessing the DataFrame.&lt;/FONT&gt;&lt;/P&gt;&lt;H3&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;Physics stabilization&lt;/FONT&gt;&lt;/H3&gt;&lt;P&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;Graph simulations are CPU-intensive. Configuring PyVis’s&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;forceAtlas2Based&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;solver with a high stabilization threshold lets the layout settle&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;EM&gt;before&lt;/EM&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;render, instead of animating a bouncing simulation that freezes the browser on large loads.&lt;/FONT&gt;&lt;/P&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;STRONG&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;pyvis network options&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/DIV&gt;&lt;PRE&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;net.set_options(&lt;SPAN class=""&gt;"""&lt;/SPAN&gt;
&lt;SPAN class=""&gt;{&lt;/SPAN&gt;
&lt;SPAN class=""&gt;  "physics": {&lt;/SPAN&gt;
&lt;SPAN class=""&gt;    "solver": "forceAtlas2Based",&lt;/SPAN&gt;
&lt;SPAN class=""&gt;    "stabilization": {"iterations": 150}&lt;/SPAN&gt;
&lt;SPAN class=""&gt;  }&lt;/SPAN&gt;
&lt;SPAN class=""&gt;}&lt;/SPAN&gt;
&lt;SPAN class=""&gt;"""&lt;/SPAN&gt;)&lt;/FONT&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;H2&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;&lt;SPAN class=""&gt;&lt;FONT size="3"&gt;05&lt;/FONT&gt;&lt;BR /&gt;&lt;/SPAN&gt;Handling data quality on the fly&lt;/FONT&gt;&lt;/H2&gt;&lt;P&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;Data is rarely perfect. A generic placeholder like&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;NA&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;or a shared “house” phone number will link thousands of unrelated people together if you let it. The Explorer includes a&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;Dynamic Exclusion&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;engine: type any value into a “Values to Remove” box, and the app instantly:&lt;/FONT&gt;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;Drops those nodes from the NetworkX graph.&lt;/FONT&gt;&lt;/LI&gt;&lt;LI&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;Recalculates the clusters.&lt;/FONT&gt;&lt;/LI&gt;&lt;LI&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;Redraws the now-cleaned visualization.&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;DIV class=""&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="KeerthiItigimat_5-1789796578733.png" style="width: 777px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/31313iAB0028D12813764D/image-dimensions/777x169?v=v2" width="777" height="169" role="button" title="KeerthiItigimat_5-1789796578733.png" alt="KeerthiItigimat_5-1789796578733.png" /&gt;&lt;/span&gt;&lt;/DIV&gt;&lt;P&gt;&lt;FONT face="georgia,palatino" color="#333333"&gt;This is the point of the whole tool: entity linkage isn’t just an algorithm, it’s human-in-the-loop verification. NetworkX supplies the analytical power; Streamlit supplies the rapid UI. Together they turn a static lineage report into something relationships can be explored, cleaned, and understood at a glance.&lt;/FONT&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;STRONG&gt;&lt;FONT face="georgia,palatino" size="4" color="#008000"&gt;Better data quality. Fewer duplicate customers. A much clearer picture of who&lt;BR /&gt;your consumers actually are.&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;</description>
      <pubDate>Sat, 19 Sep 2026 05:47:08 GMT</pubDate>
      <guid>https://community.databricks.com/t5/community-articles/unmasking-the-connected-consumer/m-p/169161#M1579</guid>
      <dc:creator>KeerthiItigimat</dc:creator>
      <dc:date>2026-09-19T05:47:08Z</dc:date>
    </item>
  </channel>
</rss>

