Spark

Semi-join: filter by existence without pulling columns

left_semi filters the left table on the existence of a key on the right, without duplicating rows even when the right side has duplicates.

Prerequisites

PySpark 3.x

Python
# Garder uniquement les événements des clients VIP
vip_events = events.join(vip_customers, "customer_id", "left_semi")

# Équivalent SQL : WHERE EXISTS (SELECT 1 FROM vip WHERE ...)

# Piège évité : avec un inner join classique, si vip_customers contient
# 3 lignes pour un même customer_id, chaque événement serait TRIPLÉ.
# Le semi-join garantit : jamais plus de lignes qu'en entrée.

assert vip_events.count() <= events.count()

Result

>>> events.count()
8421337
>>> events.join(vip_customers, "customer_id", "inner").count()
1248771                # fan-out : doublons côté référentiel
>>> vip_events.count()
912448                 # left_semi : jamais plus que l'entrée
>>> vip_events.columns == events.columns
True
PySparkSemi-joinFiltrageCohorte

Related snippets

Back to the Data Lab