The partner catalog touches a handful of fare zones; route_stops covers the whole country.
Compute the zones that are actually present, broadcast that tiny set, and discard reference rows that
provably can't match — before the shuffle pays to move them.
Each cell is one fare zone, sized here as ~8k route_stops rows on average. Blue cells are zones in presentZones — the only rows the join could ever match.
Semantically this join is a no-op — an inner join against the keys we're about to match on anyway removes nothing the outer join wouldn't have dropped. In practice it's the difference between shuffling a national feed and shuffling three zones' worth of it. Spark can do this automatically (dynamic partition pruning) only when the big side is directory-partitioned on the join key; ours isn't, so the code does it by hand.