पाठ 6 / 25

Aggregations और Null सँभालना

डेटा को समूहित और संक्षिप्त करें और ग़ायब मानों को सोच-समझकर सँभालें।

groupBy फिर agg

groupBy("city") के बाद agg(...) प्रति समूह सार count, sum, avg, min, max और countDistinct जैसे functions से निकालता है। बड़े dataset पर aggregations shuffle शुरू करते हैं, क्योंकि समूह की सारी rows को एक मशीन पर मिलना होता है। Nulls पर सावधानी चाहिए: sum और avg जैसे aggregate functions nulls अनदेखे करते हैं, पर जिस समूह का हर मान null हो वह NULL लौटाता है। स्पष्ट रूप से तय करें कि nulls भरने हैं (na.fill), rows हटानी हैं (na.drop) या रखनी हैं, और याद रखें कि null से तुलना न सही है न ग़लत, इसलिए isNull() और isNotNull() उपयोग करें।

प्रति शहर सार, चलाकर

मैंने यह Apache Spark 4.0.0 (PySpark, local mode, official Docker image में) पर चलाया। मुंबई के अकेले order का amount null है, इसलिए उसका योग और औसत NULL हैं, जबकि दिल्ली के तीन orders 430.0 और 143.3 देते हैं।

orders.groupBy("city").agg(F.count("*").alias("orders"), F.sum("amount").alias("revenue"), F.round(F.avg("amount"), 1).alias("avg")).orderBy("city").show()

Output:

+------+------+-------+-----+
|  city|orders|revenue|  avg|
+------+------+-------+-----+
| delhi|     3|  430.0|143.3|
|mumbai|     1|   NULL| NULL|
|  pune|     2|  320.0|160.0|
+------+------+-------+-----+

Nulls गिनना और भरना, चलाकर

मैंने यह Apache Spark 4.0.0 (PySpark, local mode, official Docker image में) पर चलाया। एक order का amount null है। Nulls को 0.0 से भरने के बाद कुल revenue 750.0 है।

print(orders.filter(F.col("amount").isNull()).count(), orders.na.fill({"amount": 0.0}).agg(F.sum("amount")).first()[0])

Output:

1 750.0

त्वरित जाँच: Group में null मानों के साथ `sum` क्या करता है?

  • नतीजा दोगुना करता है
  • उन्हें 1 मानता है
  • हमेशा विफल होता है
  • उन्हें अनदेखा करता है (और सभी मान null हों तभी NULL लौटाता है)
Answer

उन्हें अनदेखा करता है (और सभी मान null हों तभी NULL लौटाता है) — Aggregate functions nulls छोड़ देते हैं, जो ग़ायब डेटा छिपा सकता है, इसलिए null गिनती जाँचें।