Spark

Semi-join: فیلتر بر اساس وجود، بدون آوردن ستون اضافه

left_semi جدول چپ رو بر اساس وجود کلید توی جدول راست فیلتر می‌کنه و حتی اگه سمت راست ردیف تکراری داشته باشه، هیچ ردیفی چندبرابر نمیشه.

کاربرد

محدودکردن رویدادها به کاربرهای یک cohort، بدون خطر fan-out.

پیش‌نیازها

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()

نتیجه

>>> 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

اسنیپت‌های مرتبط

بازگشت به آزمایشگاه داده