جایگزینی count() با isEmpty: محافظی که ۳ دقیقه هزینه میداد
اگه وجود داده رو با count() چک کنی، همهچیز رو اسکن میکنه تا یک عدد بسازه که فقط با صفر مقایسهاش میکنی؛ ولی isEmpty (یا take(1)) با پیداکردن اولین ردیف وایمیسه.
کاربرد
محافظهای «اصلا دادهای برای پردازش هست؟» که توی هر اجرای ارکستریتور فعال میشن.
پیشنیازها
PySpark 3.3+ (DataFrame.isEmpty)
Python
import time
from pyspark.sql import functions as F
increment = df.filter(F.col("updated_at") > derniere_borne)
t0 = time.perf_counter()
if increment.count() == 0: # ANTI-PATTERN : compte TOUT pour tester > 0
print("rien à faire")
print(f"count() : {time.perf_counter() - t0:6.1f} s")
t0 = time.perf_counter()
if increment.isEmpty(): # s'arrête à la première ligne trouvée
print("rien à faire")
print(f"isEmpty() : {time.perf_counter() - t0:6.1f} s")
# Même logique partout : préférer take(1) / limit(1) à un count() complet
# dès que seule l'EXISTENCE importe, pas le nombre exact.نتیجه
count() : 184.6 s (scan complet : 1,2 To lus pour obtenir « 9 412 ») isEmpty() : 2.1 s (première ligne trouvée dès la partition 003) Gain : x88 sur un simple garde-fou exécuté à CHAQUE run de l'orchestrateur Sur 24 runs/jour, c'est 73 h de cluster économisées par mois
PySparkisEmptycountPerformance