पाठ 11 / 25

Partitioned Output और Partition Pruning

डेटा को किसी 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 को छूता है।

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 दिखाता है।

त्वरित जाँच: Event डेटा के लिए अच्छा partition column कौन-सा है?

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

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