# Partitioned Output और Partition Pruning — Apache Spark: DataFrames से Big Data Processing

Source: https://www.geekswithgeeks.com/hi/spark/sql-partitioned-output

> डेटा को किसी column से partitioned लिखें ताकि queries पूरे folders छोड़ सकें।

## हर मान के लिए एक folder

`df.write.partitionBy("order_date").parquet(path)` हर मान के लिए एक उप-folder बनाता है, जैसे `order_date=2026-09-01`। उस column पर filter करने वाली query, जैसे `WHERE order_date = '2026-09-02'`, सिर्फ़ मेल खाते folder पढ़ती है: **partition pruning**। ऐसे **कम cardinality** वाले partition columns चुनें जिन पर queries filter करती हैं, आम तौर पर तारीख़। उच्च-cardinality column (जैसे `customer_id`) से partition करने पर लाखों छोटी files बनती हैं, जो partition न करने से बुरा है। प्रति partition output files की उचित संख्या के साथ जोड़ें।

## Partitioned Parquet लिखना, चलाकर

मैंने यह Apache Spark 4.0.0 (PySpark, local mode, official Docker image में) पर चलाया। तीन तारीख़ें तीन उप-folders देती हैं। `order_date` पर filter के साथ पढ़ना सिर्फ़ मेल खाते folder को छूता है।

```python
import os
path = "/tmp/orders_pq"
orders.write.mode("overwrite").partitionBy("order_date").parquet(path)
print(sorted(d for d in os.listdir(path) if d.startswith("order_date")))
```

Output:

```
['order_date=2026-09-01', 'order_date=2026-09-02', 'order_date=2026-09-03']
```

## Plan में PartitionFilters देखें

`df.explain()` चलाएँ और `FileScan parquet` पंक्ति देखें: `PartitionFilters` प्रविष्टि दिखाती है कि pruning हुई, और `PushedFilters` Parquet reader को सौंपे predicates दिखाता है।

**Quiz:** Event डेटा के लिए अच्छा partition column कौन-सा है?

- [ ] मिलीसेकंड तक पूरा timestamp
- [ ] लाखों मानों वाला user_id
- [ ] एक random UUID
- [x] event_date

*Answer:* event_date. कम cardinality और अक्सर filter होने वाला column छोटी files की बाढ़ के बिना उपयोगी pruning देता है।
