Window functions over self-joins — more efficient for ranking, running totals, and lag/lead operations Broadcast joins for small dimensions — use .broadcast() hint when one table fits in memory ...