PySpark फ़िल्टर ट्यूटोरियल: तकनीकें, परफॉर्मेंस टिप्स, और उपयोग मामले
उदाहरणों के साथ प्रभावी PySpark फ़िल्टरिंग तकनीकें सीखें। प्रेडिकेट पुशडाउन, पार्टिशन प्रूनिंग, और उन्नत फ़िल्टर फ़ंक्शंस का उपयोग करके परफॉर्मेंस बढ़ाएँ।
फ़िल्टरिंग PySpark में एक बुनियादी ऑपरेशन है, जो बड़े डेटासेट्स को तेज़ी से परिष्कृत कर प्रासंगिक जानकारी तक सीमित करने के लिए आवश्यक है। PySpark में फ़िल्टर का प्रभावी उपयोग इंटरमीडिएट डेटा इंजीनियर्स, डेटा साइंटिस्ट्स, और बड़े डेटा प्रोसेसिंग करने वाले डेवलपर्स के लिए वर्कफ़्लो की दक्षता बढ़ा सकता है।
यह लेख PySpark फ़िल्टरिंग की मूलभूत और उन्नत तकनीकों का परिचय देता है, बेहतर परफॉर्मेंस के लिए ऑप्टिमाइज़ेशन रणनीतियाँ बताता है, और वास्तविक दुनिया पर लागू होने वाले व्यावहारिक उपयोग मामलों को कवर करता है।
यह ट्यूटोरियल PySpark का कुछ बुनियादी ज्ञान मानकर चलता है, लेकिन आप हमारे Getting Started with PySpark ट्यूटोरियल में जान सकते हैं कि PySpark क्या है और इसका उपयोग कैसे किया जा सकता है।
PySpark फ़िल्टर ऑपरेशन क्या है?
जैसा कि हमारे Learn PySpark From Scratch in 2025 गाइड में बताया गया है, PySpark उपयोग में सरलता और दक्षता के कारण डेटा साइंस में व्यापक रूप से उपयोग किया जाता है। यह filter() और where() जैसे बिल्ट-इन फ़ंक्शंस के माध्यम से डेटासेट्स को प्रभावी ढंग से फ़िल्टर करने के सीधे तरीके प्रदान करता है। ये फ़ंक्शंस डेटा प्रोफेशनल्स को उन पंक्तियों को अलग करने में मदद करते हैं जो निर्दिष्ट शर्तों को संतुष्ट करती हैं।
फ़िल्टरिंग डेटा प्रीप्रोसेसिंग, विश्लेषण, और पाइपलाइन ऑप्टिमाइज़ेशन में अहम है। यह आपको शुरुआत में ही अप्रासंगिक या त्रुटिपूर्ण रिकॉर्ड्स को निकालने देता है, जिससे समय बचता है, लागत घटती है, और बाद के विश्लेषण या मॉडलिंग कार्य बेहतर होते हैं।
हालाँकि यह सरल लगता है, वितरित वातावरण में फ़िल्टर्स लागू करना परफॉर्मेंस बॉटलनेक्स, अक्षम या जटिल फ़िल्टर शर्तें, और मिसिंग या अधूरे डेटा के अनुचित हैंडलिंग जैसी चुनौतियाँ पैदा कर सकता है।
Spark फ़िल्टर्स को समझना डेटा इंजीनियरिंग इंटरव्यू में सफलता के लिए महत्वपूर्ण है।
हमारे Top 30+ Big Data Interview Questions ट्यूटोरियल का उपयोग करके डेटा स्टोरेज और डिस्ट्रिब्यूटेड कम्प्यूटिंग जैसे बुनियादी कॉन्सेप्ट्स से लेकर मशीन लर्निंग और सिक्योरिटी जैसे उन्नत विषयों तक, बड़े डेटा इंटरव्यू में पूछे जाने वाले मुख्य टॉपिक्स और प्रश्नों में महारत हासिल करें।
PySpark फ़िल्टरिंग की बुनियाद
PySpark में फ़िल्टरिंग, Apache Spark पर आधारित इसके वितरित एक्ज़ीक्यूशन मॉडल के ढाँचे में काम करती है। जब आप कोई फ़िल्टर लागू करते हैं (जैसे .filter() या .where()), तो PySpark तुरंत डेटा स्कैन नहीं करता। इसके बजाय, यह एक लॉजिकल क्वेरी प्लान बनाता है जो बताता है कि आप कौन-से ट्रांसफ़ॉर्मेशन करना चाहते हैं।
दो मुख्य अवधारणाएँ PySpark में फ़िल्टरिंग की दक्षता पर महत्वपूर्ण प्रभाव डालती हैं:
लेज़ी इवैल्युएशन और
Catalyst ऑप्टिमाइज़र.
लेज़ी इवैल्युएशन
PySpark तुरंत फ़िल्टर कमांड निष्पादित नहीं करता; बल्कि यह एक लॉजिकल क्वेरी प्लान बनाता है और तब तक एक्शन टाल देता है जब तक कि स्पष्ट रूप से एक्ज़ीक्यूट करने को नहीं कहा जाए। यह मॉडल PySpark को डेटा पाइपलाइनों में ऑपरेशन्स को बेहतर तरीके से ऑप्टिमाइज़ करने की लचीलापन देता है।
Catalyst ऑप्टिमाइज़र
Spark में यह ऑप्टिमाइज़ेशन इंजन, फ़िल्टरिंग सहित लॉजिकल प्लान्स का मूल्यांकन करता है और उन्हें निष्पादित करने का सबसे तेज़ और प्रभावी तरीका स्वतः पहचानता है।
जब निष्पादन शुरू होता है, तो फ़िल्टर किया हुआ डेटा वर्कर नोड्स में RDDs या DataFrames का उपयोग करके पैरेलल प्रोसेस होता है। प्रत्येक पार्टिशन स्वतंत्र रूप से फ़िल्टर लागू करता है, जिससे यह बड़े डेटासेट्स के लिए स्केलेबल बनता है।
आइए अब विभिन्न फ़िल्टरिंग तरीकों और उनके व्यावहारिक उपयोग मामलों का अन्वेषण करें।
रिलेशनल फ़िल्टर्स
आप बड़े >, छोटे <, बराबर == और अन्य रिलेशनल ऑपरेटर्स का उपयोग करके संख्यात्मक या श्रेणीगत थ्रेशोल्ड्स के आधार पर डेटा अलग कर सकते हैं:
greater_than_df = df.filter(df.salary >50000)
category_match_df = df.filter(df.country =='France')संचालित द्वारा
लॉजिकल फ़िल्टर्स
कई शर्तों को एक फ़िल्टर में संयोजित करने के लिए, AND &, OR |, और NOT ~ जैसे लॉजिकल ऑपरेटर्स जटिल आवश्यकताओं के लिए संक्षिप्त एक्सप्रेशन्स बना सकते हैं:
combined_df = df.filter((df.age >25)&(df.city =='New York'))संचालित द्वारा
उन्नत फ़िल्टरिंग फ़ंक्शंस
PySpark में विशिष्ट फ़िल्टरिंग मामलों के लिए उन्नत फ़ंक्शंस शामिल हैं। आइए इनमें से कुछ देखें।
मेंबरशिप टेस्ट्स: एक पूर्वनिर्धारित सेट से मानों को फ़िल्टर करने के लिए isin का उपयोग करें:
selected_countries_df = df.filter(df.country.isin('Japan','Brazil','India'))संचालित द्वारा
पैटर्न मैचिंग: टेक्स्ट पैटर्न के आधार पर फ़िल्टरिंग के लिए like सरल मैचों हेतु और rlike रेगुलर एक्सप्रेशन के लिए:
name_filter_df = df.filter(df.name.like('A%'))
regex_filter_df = df.filter(df.name.rlike('^[A-Z][a-z]+संचालित द्वारा
रेंज फ़िल्टर्स:between जैसे सुविधाजनक तरीकों से फ़िल्टरिंग:
range_df = df.filter(df.age.between(25,35))संचालित द्वारा
नल जाँच: मिसिंग मानों को सुव्यवस्थित तरीके से संभालने के लिए स्पष्ट रूप से नल चेक करना:
valid_email_df = df.filter(df.email.isNotNull())संचालित द्वारा
जटिल डेटा टाइप्स की फ़िल्टरिंग
संगठन अक्सर नेस्टेड या स्ट्रक्चर्ड डेटा का उपयोग करते हैं। PySpark फ़िल्टरिंग नेस्टेड फ़ील्ड्स और एरेज़ को समायोजित करती है। स्ट्रक्चर्ड डेटा (structs) के लिए, नेस्टेड फ़ील्ड्स को आसानी से फ़िल्टर करें:
city_df = df.filter(df.address.city =='Boston')संचालित द्वारा
एरे के रूप में संग्रहीत डेटा के लिए, आप array_contains जैसे बिल्ट-इन फ़ंक्शंस का उपयोग कर सकते हैं:
from pyspark.sql.functions import array_contains
skill_df = df.filter(array_contains(df.skills,'Python'))संचालित द्वारा
कुशल PySpark फ़िल्टरिंग के लिए ऑप्टिमाइज़ेशन तकनीकें
इस सेक्शन में, आप PySpark में फ़िल्टर ऑपरेशन्स के परफॉर्मेंस को बढ़ाने की रणनीतियाँ जानेंगे।
प्रेडिकेट पुशडाउन
प्रेडिकेट पुशडाउन में फ़िल्टरिंग शर्तों को यथासंभव डेटा स्टोरेज लेयर के करीब रखना शामिल है। इसका मतलब है कि PySpark शुरुआत में कम डेटा पढ़ता है, जिससे परफॉर्मेंस बेहतर होती है।
उदाहरण के लिए:
# Read from a Parquet file
df = spark.read.parquet("s3://your-bucket/sales_data/")# Apply filter on a non-partition column (e.g., product_category)
filtered_df = df.filter(df.product_category =="Electronics")# Trigger query plan inspection
filtered_df.explain(True)संचालित द्वारा
ऊपर दिए गए उदाहरण में, हम एक सामान्य कॉलम पर फ़िल्टर लगा रहे हैं। सामान्यतः, Spark पूरा डेटासेट लोड करता और फिर मेमोरी में फ़िल्टर करता, लेकिन क्योंकि Parquet प्रेडिकेट पुशडाउन का समर्थन करता है, Spark फ़िल्टर शर्त को सीधे Parquet रीडर को भेज सकता है।
सभी पंक्तियाँ पढ़ने और फिर product_category जाँचने के बजाय, Spark केवल वे पंक्तियाँ पढ़ता है जहाँ product_category = 'Electronics' है। यह डिस्क I/O और मेमोरी बचाता है और प्रोसेसिंग तेज़ करता है।
explain फिजिकल क्वेरी प्लान प्रिंट करता है, जो दिखाता है कि निष्पादन के दौरान Spark वास्तव में क्या करने की योजना बना रहा है।
यदि प्रेडिकेट पुशडाउन लागू हुआ है, तो आपको कुछ ऐसा दिखेगा:
PushedFilters:[EqualTo(product_category,Electronics)]संचालित द्वारा
यह पुष्टि करता है कि Spark ने फ़िल्टर को डेटा लोड करने के बाद लागू करने के बजाय फ़ाइल स्कैन स्तर तक पुश कर दिया है।
प्रेडिकेट पुशडाउन Spark के टूलकिट में सबसे शक्तिशाली ऑप्टिमाइज़ेशन्स में से एक है। यह:
डिस्क से पढ़े जाने वाले डेटा की मात्रा कम करता है।
क्वेरी निष्पादन को तेज़ करता है।
मेमोरी उपयोग और नेटवर्क I/O घटाता है।
अपने फ़िल्टर्स को स्पष्ट रूप से लिखकर और Parquet जैसे फ़ॉर्मैट्स में डेटा संग्रहीत करके, आप Spark को आंतरिक रूप से निष्पादन को ऑप्टिमाइज़ करने देते हैं।
PySpark में जॉइन्स करते समय भी परफॉर्मेंस ऑप्टिमाइज़ेशन महत्वपूर्ण है। हमारे PySpark Joins: Optimize Big Data Join Performance ट्यूटोरियल से जानें कि PySpark जॉइन्स को कैसे ऑप्टिमाइज़ करें, शफ़ल्स कम करें, स्क्यू हैंडल करें, और बड़े डेटा पाइपलाइन्स तथा मशीन लर्निंग वर्कफ़्लोज़ में परफॉर्मेंस सुधारें।
पार्टिशन प्रूनिंग
जब डेटा प्रासंगिक फ़ील्ड्स (उदाहरण के लिए, तिथि) के आधार पर पार्टिशन किया गया हो, तो PySpark अनावश्यक पार्टिशन्स लोड करने से बच सकता है। प्रभावी पार्टिशन प्रूनिंग डेटा स्कैन और निष्पादन समय को काफी कम कर देती है।
मान लीजिए हमारे पास s3://your-bucket/events_data/ पर year और month द्वारा पार्टिशन किया गया Parquet डेटासेट है।
हर पार्टिशन कुछ इस तरह दिखता है:
events_data/year=2023/month=01/
events_data/year=2023/month=02/...
events_data/year=2024/month=01/संचालित द्वारा
PySpark में पार्टिशन प्रूनिंग का एक उदाहरण इस प्रकार दिखेगा:
df = spark.read.parquet("s3://your-bucket/events_data/")
filtered_df = df.filter((df.year ==2023)&(df.month ==6))# .explain(True) to verify pruning
filtered_df.explain(True)संचालित द्वारा
year और month पार्टिशन कॉलम हैं, जो Spark के Catalyst ऑप्टिमाइज़र को सभी अप्रासंगिक पार्टिशन्स को प्रून करने की अनुमति देते हैं।
कैशिंग और परसिस्टेंस
फ़िल्टर किए गए परिणाम अक्सर किसी विश्लेषणात्मक वर्कफ़्लो में कई बार उपयोग होते हैं। फ़िल्टर किए गए परिणामों को अस्थायी रूप से मेमोरी में स्टोर करना कैशिंग के ज़रिए पुन: गणना से बचाता है, पर संसाधनों की बचत के लिए इसे सावधानी से उपयोग करना चाहिए।
recent_users_df = df.filter(df.registration_date >='2022-01-01')
recent_users_df.cache()संचालित द्वारा
उन्नत फ़िल्टरिंग रणनीतियाँ और उपयोग मामले
आइए अब जटिल परिदृश्यों का अन्वेषण करें जहाँ उन्नत फ़िल्टरिंग तकनीकों को लागू किया जाता है।
समय-आधारित फ़िल्टरिंग
टाइम-सीरीज़ डेटा संभालते समय, सटीक कालिक फ़िल्टरिंग की अक्सर आवश्यकता होती है। किसी विशिष्ट समय-सीमा के भीतर डेटा फ़िल्टर करना सरल है:
time_df = df.filter((df.date >='2023-08-01')&(df.date <'2023-09-01'))संचालित द्वारा
ऊपर दिया गया अगस्त 2023 के सभी रिकॉर्ड्स का चयन करता है। यह शर्त DateType और TimestampType कॉलम्स के साथ काम करती है।
गहरी टाइम-सीरीज़ विश्लेषण के लिए, जैसे रोलिंग मैट्रिक्स की गणना या समय के साथ रुझानों की पहचान, आप कालिक फ़िल्टर्स को विंडो फ़ंक्शंस के साथ जोड़ सकते हैं। उदाहरण के लिए, आप पहले एक तिथि सीमा फ़िल्टर कर सकते हैं, फिर मूविंग एवरेज लागू कर सकते हैं या प्रत्येक दिन के भीतर इवेंट्स को रैंक कर सकते हैं:
from pyspark.sql.window import Window
from pyspark.sql.functions import avg
window_spec = Window.partitionBy("date").orderBy("timestamp").rowsBetween(-2,0)
df_filtered = df.filter((df.date >='2023-08-01')&(df.date <'2023-09-01'))
df_with_avg = df_filtered.withColumn("rolling_avg", avg("value").over(window_spec))संचालित द्वारा
यह उदाहरण प्रति दिन टाइमस्टैम्प के क्रम में 3-पंक्ति का रोलिंग एवरेज गणना करता है। कालिक फ़िल्टर्स को विंडो फ़ंक्शंस के साथ जोड़ने से आपको समय-आधारित एनालिटिक्स पर सूक्ष्म नियंत्रण मिलता है।
स्ट्रीमिंग डेटा में फ़िल्टरिंग
रियल-टाइम डेटा स्ट्रीम्स को फ़िल्टर करना विशिष्ट चुनौतियाँ पेश करता है। बैच प्रोसेसिंग के विपरीत, डेटा अबाधित होता है और निरंतर आता रहता है। इसके लिए फ़िल्टर्स को तुरंत लागू करना होता है, साथ ही लेट-आने वाली घटनाओं को सावधानीपूर्वक हैंडल करना होता है ताकि सटीक परिणाम सुनिश्चित किए जा सकें।
PySpark का Structured Streaming स्ट्रीमिंग डेटा को फ़िल्टर करने और टाइमिंग इश्यूज़ को प्रभावी ढंग से मैनेज करने के लिए सहज टूल्स देता है। आप स्टेटिक DataFrame की तरह ही फ़िल्टर्स लगा सकते हैं, साथ ही वाटरमार्क्स का उपयोग कर यह नियंत्रित कर सकते हैं कि सिस्टम को देर से आए डेटा के लिए परिणाम फ़ाइनल करने से पहले कितनी देर तक प्रतीक्षा करनी चाहिए।
यहाँ एक उदाहरण है:
# Example: Real-Time Filtering with Watermarkingfrom pyspark.sql import SparkSession
from pyspark.sql.functions import col
from pyspark.sql.types import StructType, StringType, TimestampType
# Set up Spark session
spark = SparkSession.builder.appName("RealTimeFiltering").getOrCreate()# Define schema for streaming data
schema = StructType() \
.add("user_id", StringType()) \
.add("event_type", StringType()) \
.add("event_time", TimestampType())# Read from a Kafka stream (or any supported source)
streaming_df = spark.readStream \
.format("kafka") \
.option("kafka.bootstrap.servers","localhost:9092") \
.option("subscribe","user_events") \
.load() \
.selectExpr("CAST(value AS STRING) as json") \
.selectExpr("from_json(json, 'user_id STRING, event_type STRING, event_time TIMESTAMP') as data") \
.select("data.*")# Apply real-time filter: only 'click' events
filtered_df = streaming_df.filter(col("event_type")=="click")# Handle late data with watermarking (e.g., 10 minutes tolerance)
filtered_with_watermark = filtered_df \
.withWatermark("event_time","10 minutes")# Write to console (for demo purposes)
query = filtered_with_watermark.writeStream \
.outputMode("append") \
.format("console") \
.start()
query.awaitTermination()संचालित द्वारा
उदाहरण में:
रियल-टाइम फ़िल्टरिंग .filter(col("event_type") == "click") से की जाती है।
Structured Streaming लगातार आने वाले Kafka डेटा को हैंडल करता है।
वाटरमार्किंग (withWatermark(...)) सुनिश्चित करती है कि लेट-आने वाली घटनाओं को एक समय-खिड़की (यहाँ 10 मिनट) के भीतर हैंडल किया जाए।
रियल-टाइम फ़िल्टर्स और वाटरमार्किंग को मिलाकर, आप नेटवर्क देरी या अनियमित इवेंट्स की स्थिति में भी विश्वसनीय स्ट्रीमिंग एप्लिकेशन बना सकते हैं।
मशीन लर्निंग डेटा प्रिपरेशन
मशीन लर्निंग पाइपलाइनों में, प्रीप्रोसेसिंग के दौरान प्रभावी फ़िल्टरिंग अत्यंत महत्वपूर्ण है। यह केवल शोर हटाने के लिए ही नहीं, बल्कि मॉडल ट्रेनिंग के लिए सबसे प्रासंगिक फीचर्स चुनने के लिए भी उपयोगी होती है। फ़िल्टरिंग आउटलायर्स हटाने, मिसिंग या अमान्य मानों वाले रिकॉर्ड्स ड्रॉप करने, और केवल उन विशेषताओं को बनाए रखने में मदद करती है जो सार्थक संकेत देती हैं।
यह दो-स्तरीय दृष्टिकोण—डेटा साफ़ करना और प्रमुख फीचर्स का चयन—आपके मॉडलों के परफॉर्मेंस और विश्वसनीयता दोनों में नाटकीय सुधार ला सकता है, जैसा कि हमारे Cleaning Data with PySpark कोर्स में कवर किया गया है। इसके बिना, मॉडल अप्रासंगिक इनपुट्स से प्रभावित हो सकते हैं या खराब डेटा से विकृत हो सकते हैं।
हमारा Big Data with PySpark कोर्स PySpark में मशीन लर्निंग के बारे में और विस्तार से बताता है।
सर्वोत्तम प्रथाएँ और आम चुनौतियाँ
इस सेक्शन में, हम PySpark के साथ डेटा फ़िल्टर करते समय अपनाई जाने वाली सर्वोत्तम प्रथाओं और आम चुनौतियों का अन्वेषण करेंगे।
परफॉर्मेंस ट्यूनिंग चेकलिस्ट
फ़िल्टरिंग दक्षता बढ़ाने के लिए कुछ व्यावहारिक सिफारिशें:
1. प्रोसेसिंग के दौरान यथासंभव जल्दी फ़िल्टर करें।
2. डेटा शफ़लिंग कम करने के लिए चुने गए कॉलम्स की संख्या सीमित रखें।
3. कस्टम UDFs (यूज़र-डिफ़ाइंड फ़ंक्शंस) की बजाय PySpark के बिल्ट-इन फ़िल्टर फ़ंक्शंस का प्राथमिकता से उपयोग करें।
आम गलतियाँ
इन आम गलतियों से बचें:
1. जटिल या अनावश्यक रूप से नेस्टेड फ़िल्टर शर्तें, जो ऑप्टिमाइज़र परफॉर्मेंस को नुकसान पहुँचाती हैं
बेहद जटिल फ़िल्टर एक्सप्रेशन्स Spark के Catalyst ऑप्टिमाइज़र में बाधा बन सकते हैं। उदाहरण के लिए, बहुत सारे OR जोड़ना या गहराई से नेस्टेड लॉजिकल स्टेटमेंट्स लॉजिकल प्लान को जटिल बना सकते हैं, जिससे उप-इष्टतम निष्पादन होता है। जहाँ कई इक्वैलिटी जाँचें शामिल हों, वहाँ isin() का उपयोग करने पर विचार करें या किसी छोटे DataFrame के साथ जॉइन करें ताकि ब्रॉडकास्ट जॉइन्स का लाभ उठाया जा सके, जो बड़े डेटासेट्स के लिए अधिक कुशल होते हैं।
2. अत्यधिक कैशिंग, यदि गलत उपयोग हो, तो मेमोरी समस्याएँ पैदा कर सकती है
हालाँकि DataFrames को पुन: उपयोग के लिए कैश करना फ़ायदेमंद है, लेकिन अंधाधुंध उपयोग क्लस्टर मेमोरी को समाप्त कर सकता है। बड़े या कई DataFrames को उनके पुन: उपयोग का आकलन किए बिना कैश करना आउट-ऑफ़-मेमोरी त्रुटियों का कारण बन सकता है। केवल उन्हीं DataFrames को कैश करना महत्वपूर्ण है जिनका कई बार पुन: उपयोग होता है, और जब उनकी आवश्यकता न रहे तो उन्हें अनपरसिस्ट कर दें।
3. स्क्यूड डेटा डिस्ट्रीब्यूशन्स की अनदेखी फ़िल्टरिंग की गति घटा सकती है
डेटा स्क्यू, जहाँ कुछ कीज़ पर अनुपातहीन रूप से अधिक डेटा होता है, परफॉर्मेंस बॉटलनेक्स पैदा कर सकता है। स्क्यूड कीज़ पर जॉइन्स या एग्रीगेशन्स जैसे ऑपरेशन्स असमान टास्क निष्पादन समय का कारण बन सकते हैं। साल्टिंग (कीज़ में रैंडम प्रीफ़िक्स जोड़ना), कस्टम पार्टिशनिंग, या Spark के Adaptive Query Execution जैसी तकनीकें इन समस्याओं को कम करने में मदद कर सकती हैं।
निष्कर्ष
उचित फ़िल्टरिंग PySpark के साथ कुशल डेटा प्रोसेसिंग में अहम भूमिका निभाती है। यह विश्लेषणात्मक वर्कफ़्लोज़ को सुव्यवस्थित करती है, कम्प्यूटेशनल संसाधनों की बचत करती है, और बाद के विश्लेषणात्मक परिणामों को स्पष्टता प्रदान करती है। PySpark के सरल लेकिन शक्तिशाली फ़िल्टरिंग तरीकों का लाभ उठाते हुए, और प्रेडिकेट पुशडाउन, पार्टिशन प्रूनिंग, तथा चयनात्मक कैशिंग जैसी ऑप्टिमाइज़्ड रणनीतियों के साथ, आप अपनी डेटा इंजीनियरिंग प्रैक्टिसेस को उल्लेखनीय रूप से बेहतर बना सकते हैं। इन तकनीकों को लगातार लागू करना मज़बूत और मेंटेन करने योग्य डेटा पाइपलाइंस सुनिश्चित करता है।
PySpark में `filter()` और `where()` में क्या अंतर है?⌄
PySpark में filter() और where() दोनों एक ही कार्य करते हैं—निर्दिष्ट शर्तों को पूरा करने वाली पंक्तियों का चयन। वे परस्पर विनिमेय हैं, और इनमें से चुनाव आमतौर पर व्यक्तिगत या शैलीगत प्राथमिकता का विषय होता है।
PySpark बड़े डेटासेट्स पर फ़िल्टरिंग कैसे संभालता है?⌄
PySpark लेज़ी इवैल्युएशन और Catalyst Optimizer का उपयोग करके फ़िल्टरिंग ऑपरेशन्स को टालता और ऑप्टिमाइज़ करता है। यह प्रेडिकेट पुशडाउन और पार्टिशन प्रूनिंग का भी समर्थन करता है, जो मेमोरी में लोड किए जाने वाले डेटा की मात्रा घटाकर फ़िल्टरिंग को काफी तेज़ करते हैं।
क्या मैं PySpark में टेक्स्ट कॉलम्स को रेगुलर एक्सप्रेशन्स से फ़िल्टर कर सकता/सकती हूँ?⌄
हाँ, PySpark rlike() के माध्यम से पैटर्न-आधारित फ़िल्टरिंग की अनुमति देता है, जो पूर्ण रेगुलर एक्सप्रेशन का समर्थन करता है, और like() स्ट्रिंग कॉलम्स पर SQL-स्टाइल वाइल्डकार्ड मैचिंग के लिए।
फ़िल्टरिंग परफॉर्मेंस को ऑप्टिमाइज़ करने के सर्वोत्तम अभ्यास क्या हैं?⌄
मुख्य प्रथाएँ शामिल हैं: अपनी डेटा पाइपलाइन में यथासंभव जल्दी फ़िल्टर करना, UDFs का न्यूनतम उपयोग करना, पार्टिशन किए गए डेटा का लाभ उठाना, प्रोसेसिंग के लिए चुने गए कॉलम्स को कम करना, और कैशिंग का सावधानी से उपयोग करना।
स्ट्रक्चर्ड डेटा में नेस्टेड या एरे फ़ील्ड्स को कैसे फ़िल्टर करें?⌄
PySpark सीधे नेस्टेड फ़ील्ड्स (उदा., df.address.city == 'Boston') और array_contains() जैसे फ़ंक्शंस का उपयोग करके एरे एलिमेंट्स को फ़िल्टर करने का समर्थन करता है, जिससे जटिल डेटा स्ट्रक्चर्स में भी मज़बूत फ़िल्टरिंग संभव होती है।
फ़िल्टरिंग PySpark में एक बुनियादी ऑपरेशन है, जो बड़े डेटासेट्स को तेज़ी से परिष्कृत कर प्रासंगिक जानकारी तक सीमित करने के लिए आवश्यक है। PySpark में फ़िल्टर का प्रभावी उपयोग इंटरमीडिएट डेटा इंजीनियर्स, डेटा साइंटिस्ट्स, और बड़े डेटा प्रोसेसिंग करने वाले डेवलपर्स के लिए वर्कफ़्लो की दक्षता बढ़ा सकता है।
यह लेख PySpark फ़िल्टरिंग की मूलभूत और उन्नत तकनीकों का परिचय देता है, बेहतर परफॉर्मेंस के लिए ऑप्टिमाइज़ेशन रणनीतियाँ बताता है, और वास्तविक दुनिया पर लागू होने वाले व्यावहारिक उपयोग मामलों को कवर करता है।
यह ट्यूटोरियल PySpark का कुछ बुनियादी ज्ञान मानकर चलता है, लेकिन आप हमारे Getting Started with PySpark ट्यूटोरियल में जान सकते हैं कि PySpark क्या है और इसका उपयोग कैसे किया जा सकता है।
PySpark फ़िल्टर ऑपरेशन क्या है?
जैसा कि हमारे Learn PySpark From Scratch in 2025 गाइड में बताया गया है, PySpark उपयोग में सरलता और दक्षता के कारण डेटा साइंस में व्यापक रूप से उपयोग किया जाता है। यह
filter()औरwhere()जैसे बिल्ट-इन फ़ंक्शंस के माध्यम से डेटासेट्स को प्रभावी ढंग से फ़िल्टर करने के सीधे तरीके प्रदान करता है। ये फ़ंक्शंस डेटा प्रोफेशनल्स को उन पंक्तियों को अलग करने में मदद करते हैं जो निर्दिष्ट शर्तों को संतुष्ट करती हैं।फ़िल्टरिंग डेटा प्रीप्रोसेसिंग, विश्लेषण, और पाइपलाइन ऑप्टिमाइज़ेशन में अहम है। यह आपको शुरुआत में ही अप्रासंगिक या त्रुटिपूर्ण रिकॉर्ड्स को निकालने देता है, जिससे समय बचता है, लागत घटती है, और बाद के विश्लेषण या मॉडलिंग कार्य बेहतर होते हैं।
हालाँकि यह सरल लगता है, वितरित वातावरण में फ़िल्टर्स लागू करना परफॉर्मेंस बॉटलनेक्स, अक्षम या जटिल फ़िल्टर शर्तें, और मिसिंग या अधूरे डेटा के अनुचित हैंडलिंग जैसी चुनौतियाँ पैदा कर सकता है।
Spark फ़िल्टर्स को समझना डेटा इंजीनियरिंग इंटरव्यू में सफलता के लिए महत्वपूर्ण है।
हमारे Top 30+ Big Data Interview Questions ट्यूटोरियल का उपयोग करके डेटा स्टोरेज और डिस्ट्रिब्यूटेड कम्प्यूटिंग जैसे बुनियादी कॉन्सेप्ट्स से लेकर मशीन लर्निंग और सिक्योरिटी जैसे उन्नत विषयों तक, बड़े डेटा इंटरव्यू में पूछे जाने वाले मुख्य टॉपिक्स और प्रश्नों में महारत हासिल करें।
PySpark फ़िल्टरिंग की बुनियाद
PySpark में फ़िल्टरिंग, Apache Spark पर आधारित इसके वितरित एक्ज़ीक्यूशन मॉडल के ढाँचे में काम करती है। जब आप कोई फ़िल्टर लागू करते हैं (जैसे
.filter()या.where()), तो PySpark तुरंत डेटा स्कैन नहीं करता। इसके बजाय, यह एक लॉजिकल क्वेरी प्लान बनाता है जो बताता है कि आप कौन-से ट्रांसफ़ॉर्मेशन करना चाहते हैं।दो मुख्य अवधारणाएँ PySpark में फ़िल्टरिंग की दक्षता पर महत्वपूर्ण प्रभाव डालती हैं:
लेज़ी इवैल्युएशन
PySpark तुरंत फ़िल्टर कमांड निष्पादित नहीं करता; बल्कि यह एक लॉजिकल क्वेरी प्लान बनाता है और तब तक एक्शन टाल देता है जब तक कि स्पष्ट रूप से एक्ज़ीक्यूट करने को नहीं कहा जाए। यह मॉडल PySpark को डेटा पाइपलाइनों में ऑपरेशन्स को बेहतर तरीके से ऑप्टिमाइज़ करने की लचीलापन देता है।
Catalyst ऑप्टिमाइज़र
Spark में यह ऑप्टिमाइज़ेशन इंजन, फ़िल्टरिंग सहित लॉजिकल प्लान्स का मूल्यांकन करता है और उन्हें निष्पादित करने का सबसे तेज़ और प्रभावी तरीका स्वतः पहचानता है।
जब निष्पादन शुरू होता है, तो फ़िल्टर किया हुआ डेटा वर्कर नोड्स में RDDs या DataFrames का उपयोग करके पैरेलल प्रोसेस होता है। प्रत्येक पार्टिशन स्वतंत्र रूप से फ़िल्टर लागू करता है, जिससे यह बड़े डेटासेट्स के लिए स्केलेबल बनता है।
आप हमारे PySpark चीट शीट: Spark in Python ट्यूटोरियल में RDDs के बारे में अधिक जानकारी देख सकते हैं।
कोर PySpark फ़िल्टर सिंटैक्स
शर्तों के आधार पर डेटा फ़िल्टर करना सरल है। आप शर्तें कॉलम एक्सप्रेशन्स या SQL-जैसी स्ट्रिंग्स के रूप में दे सकते हैं।
1. कॉलम एक्सप्रेशन्स
शर्तें परिभाषित करने के लिए DataFrame कॉलम ऑब्जेक्ट्स और ऑपरेटर्स का उपयोग करें:
2. SQL-जैसी स्ट्रिंग्स
शर्त को SQL-स्टाइल स्ट्रिंग के रूप में लिखें:
वैकल्पिक रूप से, आप
where()फ़ंक्शन को भी इसी तरह उपयोग कर सकते हैं:ये सभी वैध हैं और वही परिणाम देते हैं। इनमे से चुनाव अक्सर व्यक्तिगत पसंद या आपके संदर्भ में जो शैली अधिक पठनीय लगे, उस पर निर्भर करता है।
PySpark में SQL सिंटैक्स का उपयोग करने के बारे में अधिक जानने के लिए हमारा Introduction to Spark SQL in Python कोर्स देखें।
PySpark फ़िल्टरिंग तकनीकें और अनुप्रयोग
आइए अब विभिन्न फ़िल्टरिंग तरीकों और उनके व्यावहारिक उपयोग मामलों का अन्वेषण करें।
रिलेशनल फ़िल्टर्स
आप बड़े
>, छोटे<, बराबर==और अन्य रिलेशनल ऑपरेटर्स का उपयोग करके संख्यात्मक या श्रेणीगत थ्रेशोल्ड्स के आधार पर डेटा अलग कर सकते हैं:लॉजिकल फ़िल्टर्स
कई शर्तों को एक फ़िल्टर में संयोजित करने के लिए, AND
&, OR|, और NOT~जैसे लॉजिकल ऑपरेटर्स जटिल आवश्यकताओं के लिए संक्षिप्त एक्सप्रेशन्स बना सकते हैं:उन्नत फ़िल्टरिंग फ़ंक्शंस
PySpark में विशिष्ट फ़िल्टरिंग मामलों के लिए उन्नत फ़ंक्शंस शामिल हैं। आइए इनमें से कुछ देखें।
मेंबरशिप टेस्ट्स: एक पूर्वनिर्धारित सेट से मानों को फ़िल्टर करने के लिए
isinका उपयोग करें:पैटर्न मैचिंग: टेक्स्ट पैटर्न के आधार पर फ़िल्टरिंग के लिए
likeसरल मैचों हेतु औरrlikeरेगुलर एक्सप्रेशन के लिए:रेंज फ़िल्टर्स:
betweenजैसे सुविधाजनक तरीकों से फ़िल्टरिंग:नल जाँच: मिसिंग मानों को सुव्यवस्थित तरीके से संभालने के लिए स्पष्ट रूप से नल चेक करना:
जटिल डेटा टाइप्स की फ़िल्टरिंग
संगठन अक्सर नेस्टेड या स्ट्रक्चर्ड डेटा का उपयोग करते हैं। PySpark फ़िल्टरिंग नेस्टेड फ़ील्ड्स और एरेज़ को समायोजित करती है। स्ट्रक्चर्ड डेटा (structs) के लिए, नेस्टेड फ़ील्ड्स को आसानी से फ़िल्टर करें:
एरे के रूप में संग्रहीत डेटा के लिए, आप
array_containsजैसे बिल्ट-इन फ़ंक्शंस का उपयोग कर सकते हैं:कुशल PySpark फ़िल्टरिंग के लिए ऑप्टिमाइज़ेशन तकनीकें
इस सेक्शन में, आप PySpark में फ़िल्टर ऑपरेशन्स के परफॉर्मेंस को बढ़ाने की रणनीतियाँ जानेंगे।
प्रेडिकेट पुशडाउन
प्रेडिकेट पुशडाउन में फ़िल्टरिंग शर्तों को यथासंभव डेटा स्टोरेज लेयर के करीब रखना शामिल है। इसका मतलब है कि PySpark शुरुआत में कम डेटा पढ़ता है, जिससे परफॉर्मेंस बेहतर होती है।
उदाहरण के लिए:
ऊपर दिए गए उदाहरण में, हम एक सामान्य कॉलम पर फ़िल्टर लगा रहे हैं। सामान्यतः, Spark पूरा डेटासेट लोड करता और फिर मेमोरी में फ़िल्टर करता, लेकिन क्योंकि Parquet प्रेडिकेट पुशडाउन का समर्थन करता है, Spark फ़िल्टर शर्त को सीधे Parquet रीडर को भेज सकता है।
सभी पंक्तियाँ पढ़ने और फिर
product_categoryजाँचने के बजाय, Spark केवल वे पंक्तियाँ पढ़ता है जहाँproduct_category = 'Electronics'है। यह डिस्क I/O और मेमोरी बचाता है और प्रोसेसिंग तेज़ करता है।explainफिजिकल क्वेरी प्लान प्रिंट करता है, जो दिखाता है कि निष्पादन के दौरान Spark वास्तव में क्या करने की योजना बना रहा है।यदि प्रेडिकेट पुशडाउन लागू हुआ है, तो आपको कुछ ऐसा दिखेगा:
यह पुष्टि करता है कि Spark ने फ़िल्टर को डेटा लोड करने के बाद लागू करने के बजाय फ़ाइल स्कैन स्तर तक पुश कर दिया है।
प्रेडिकेट पुशडाउन Spark के टूलकिट में सबसे शक्तिशाली ऑप्टिमाइज़ेशन्स में से एक है। यह:
अपने फ़िल्टर्स को स्पष्ट रूप से लिखकर और Parquet जैसे फ़ॉर्मैट्स में डेटा संग्रहीत करके, आप Spark को आंतरिक रूप से निष्पादन को ऑप्टिमाइज़ करने देते हैं।
PySpark में जॉइन्स करते समय भी परफॉर्मेंस ऑप्टिमाइज़ेशन महत्वपूर्ण है। हमारे PySpark Joins: Optimize Big Data Join Performance ट्यूटोरियल से जानें कि PySpark जॉइन्स को कैसे ऑप्टिमाइज़ करें, शफ़ल्स कम करें, स्क्यू हैंडल करें, और बड़े डेटा पाइपलाइन्स तथा मशीन लर्निंग वर्कफ़्लोज़ में परफॉर्मेंस सुधारें।
पार्टिशन प्रूनिंग
जब डेटा प्रासंगिक फ़ील्ड्स (उदाहरण के लिए, तिथि) के आधार पर पार्टिशन किया गया हो, तो PySpark अनावश्यक पार्टिशन्स लोड करने से बच सकता है। प्रभावी पार्टिशन प्रूनिंग डेटा स्कैन और निष्पादन समय को काफी कम कर देती है।
मान लीजिए हमारे पास
s3://your-bucket/events_data/परyearऔरmonthद्वारा पार्टिशन किया गया Parquet डेटासेट है।हर पार्टिशन कुछ इस तरह दिखता है:
PySpark में पार्टिशन प्रूनिंग का एक उदाहरण इस प्रकार दिखेगा:
yearऔरmonthपार्टिशन कॉलम हैं, जो Spark के Catalyst ऑप्टिमाइज़र को सभी अप्रासंगिक पार्टिशन्स को प्रून करने की अनुमति देते हैं।कैशिंग और परसिस्टेंस
फ़िल्टर किए गए परिणाम अक्सर किसी विश्लेषणात्मक वर्कफ़्लो में कई बार उपयोग होते हैं। फ़िल्टर किए गए परिणामों को अस्थायी रूप से मेमोरी में स्टोर करना कैशिंग के ज़रिए पुन: गणना से बचाता है, पर संसाधनों की बचत के लिए इसे सावधानी से उपयोग करना चाहिए।
उन्नत फ़िल्टरिंग रणनीतियाँ और उपयोग मामले
आइए अब जटिल परिदृश्यों का अन्वेषण करें जहाँ उन्नत फ़िल्टरिंग तकनीकों को लागू किया जाता है।
समय-आधारित फ़िल्टरिंग
टाइम-सीरीज़ डेटा संभालते समय, सटीक कालिक फ़िल्टरिंग की अक्सर आवश्यकता होती है। किसी विशिष्ट समय-सीमा के भीतर डेटा फ़िल्टर करना सरल है:
ऊपर दिया गया अगस्त 2023 के सभी रिकॉर्ड्स का चयन करता है। यह शर्त
DateTypeऔरTimestampTypeकॉलम्स के साथ काम करती है।गहरी टाइम-सीरीज़ विश्लेषण के लिए, जैसे रोलिंग मैट्रिक्स की गणना या समय के साथ रुझानों की पहचान, आप कालिक फ़िल्टर्स को विंडो फ़ंक्शंस के साथ जोड़ सकते हैं। उदाहरण के लिए, आप पहले एक तिथि सीमा फ़िल्टर कर सकते हैं, फिर मूविंग एवरेज लागू कर सकते हैं या प्रत्येक दिन के भीतर इवेंट्स को रैंक कर सकते हैं:
यह उदाहरण प्रति दिन टाइमस्टैम्प के क्रम में 3-पंक्ति का रोलिंग एवरेज गणना करता है। कालिक फ़िल्टर्स को विंडो फ़ंक्शंस के साथ जोड़ने से आपको समय-आधारित एनालिटिक्स पर सूक्ष्म नियंत्रण मिलता है।
स्ट्रीमिंग डेटा में फ़िल्टरिंग
रियल-टाइम डेटा स्ट्रीम्स को फ़िल्टर करना विशिष्ट चुनौतियाँ पेश करता है। बैच प्रोसेसिंग के विपरीत, डेटा अबाधित होता है और निरंतर आता रहता है। इसके लिए फ़िल्टर्स को तुरंत लागू करना होता है, साथ ही लेट-आने वाली घटनाओं को सावधानीपूर्वक हैंडल करना होता है ताकि सटीक परिणाम सुनिश्चित किए जा सकें।
PySpark का Structured Streaming स्ट्रीमिंग डेटा को फ़िल्टर करने और टाइमिंग इश्यूज़ को प्रभावी ढंग से मैनेज करने के लिए सहज टूल्स देता है। आप स्टेटिक DataFrame की तरह ही फ़िल्टर्स लगा सकते हैं, साथ ही वाटरमार्क्स का उपयोग कर यह नियंत्रित कर सकते हैं कि सिस्टम को देर से आए डेटा के लिए परिणाम फ़ाइनल करने से पहले कितनी देर तक प्रतीक्षा करनी चाहिए।
यहाँ एक उदाहरण है:
उदाहरण में:
.filter(col("event_type") == "click")से की जाती है।(withWatermark(...))सुनिश्चित करती है कि लेट-आने वाली घटनाओं को एक समय-खिड़की (यहाँ 10 मिनट) के भीतर हैंडल किया जाए।रियल-टाइम फ़िल्टर्स और वाटरमार्किंग को मिलाकर, आप नेटवर्क देरी या अनियमित इवेंट्स की स्थिति में भी विश्वसनीय स्ट्रीमिंग एप्लिकेशन बना सकते हैं।
मशीन लर्निंग डेटा प्रिपरेशन
मशीन लर्निंग पाइपलाइनों में, प्रीप्रोसेसिंग के दौरान प्रभावी फ़िल्टरिंग अत्यंत महत्वपूर्ण है। यह केवल शोर हटाने के लिए ही नहीं, बल्कि मॉडल ट्रेनिंग के लिए सबसे प्रासंगिक फीचर्स चुनने के लिए भी उपयोगी होती है। फ़िल्टरिंग आउटलायर्स हटाने, मिसिंग या अमान्य मानों वाले रिकॉर्ड्स ड्रॉप करने, और केवल उन विशेषताओं को बनाए रखने में मदद करती है जो सार्थक संकेत देती हैं।
यह दो-स्तरीय दृष्टिकोण—डेटा साफ़ करना और प्रमुख फीचर्स का चयन—आपके मॉडलों के परफॉर्मेंस और विश्वसनीयता दोनों में नाटकीय सुधार ला सकता है, जैसा कि हमारे Cleaning Data with PySpark कोर्स में कवर किया गया है। इसके बिना, मॉडल अप्रासंगिक इनपुट्स से प्रभावित हो सकते हैं या खराब डेटा से विकृत हो सकते हैं।
हमारा Big Data with PySpark कोर्स PySpark में मशीन लर्निंग के बारे में और विस्तार से बताता है।
सर्वोत्तम प्रथाएँ और आम चुनौतियाँ
इस सेक्शन में, हम PySpark के साथ डेटा फ़िल्टर करते समय अपनाई जाने वाली सर्वोत्तम प्रथाओं और आम चुनौतियों का अन्वेषण करेंगे।
परफॉर्मेंस ट्यूनिंग चेकलिस्ट
फ़िल्टरिंग दक्षता बढ़ाने के लिए कुछ व्यावहारिक सिफारिशें:
1. प्रोसेसिंग के दौरान यथासंभव जल्दी फ़िल्टर करें।
2. डेटा शफ़लिंग कम करने के लिए चुने गए कॉलम्स की संख्या सीमित रखें।
3. कस्टम UDFs (यूज़र-डिफ़ाइंड फ़ंक्शंस) की बजाय PySpark के बिल्ट-इन फ़िल्टर फ़ंक्शंस का प्राथमिकता से उपयोग करें।
आम गलतियाँ
इन आम गलतियों से बचें:
1. जटिल या अनावश्यक रूप से नेस्टेड फ़िल्टर शर्तें, जो ऑप्टिमाइज़र परफॉर्मेंस को नुकसान पहुँचाती हैं
बेहद जटिल फ़िल्टर एक्सप्रेशन्स Spark के Catalyst ऑप्टिमाइज़र में बाधा बन सकते हैं। उदाहरण के लिए, बहुत सारे
ORजोड़ना या गहराई से नेस्टेड लॉजिकल स्टेटमेंट्स लॉजिकल प्लान को जटिल बना सकते हैं, जिससे उप-इष्टतम निष्पादन होता है। जहाँ कई इक्वैलिटी जाँचें शामिल हों, वहाँisin()का उपयोग करने पर विचार करें या किसी छोटे DataFrame के साथ जॉइन करें ताकि ब्रॉडकास्ट जॉइन्स का लाभ उठाया जा सके, जो बड़े डेटासेट्स के लिए अधिक कुशल होते हैं।2. अत्यधिक कैशिंग, यदि गलत उपयोग हो, तो मेमोरी समस्याएँ पैदा कर सकती है
हालाँकि DataFrames को पुन: उपयोग के लिए कैश करना फ़ायदेमंद है, लेकिन अंधाधुंध उपयोग क्लस्टर मेमोरी को समाप्त कर सकता है। बड़े या कई DataFrames को उनके पुन: उपयोग का आकलन किए बिना कैश करना आउट-ऑफ़-मेमोरी त्रुटियों का कारण बन सकता है। केवल उन्हीं DataFrames को कैश करना महत्वपूर्ण है जिनका कई बार पुन: उपयोग होता है, और जब उनकी आवश्यकता न रहे तो उन्हें अनपरसिस्ट कर दें।
3. स्क्यूड डेटा डिस्ट्रीब्यूशन्स की अनदेखी फ़िल्टरिंग की गति घटा सकती है
डेटा स्क्यू, जहाँ कुछ कीज़ पर अनुपातहीन रूप से अधिक डेटा होता है, परफॉर्मेंस बॉटलनेक्स पैदा कर सकता है। स्क्यूड कीज़ पर जॉइन्स या एग्रीगेशन्स जैसे ऑपरेशन्स असमान टास्क निष्पादन समय का कारण बन सकते हैं। साल्टिंग (कीज़ में रैंडम प्रीफ़िक्स जोड़ना), कस्टम पार्टिशनिंग, या Spark के Adaptive Query Execution जैसी तकनीकें इन समस्याओं को कम करने में मदद कर सकती हैं।
निष्कर्ष
उचित फ़िल्टरिंग PySpark के साथ कुशल डेटा प्रोसेसिंग में अहम भूमिका निभाती है। यह विश्लेषणात्मक वर्कफ़्लोज़ को सुव्यवस्थित करती है, कम्प्यूटेशनल संसाधनों की बचत करती है, और बाद के विश्लेषणात्मक परिणामों को स्पष्टता प्रदान करती है। PySpark के सरल लेकिन शक्तिशाली फ़िल्टरिंग तरीकों का लाभ उठाते हुए, और प्रेडिकेट पुशडाउन, पार्टिशन प्रूनिंग, तथा चयनात्मक कैशिंग जैसी ऑप्टिमाइज़्ड रणनीतियों के साथ, आप अपनी डेटा इंजीनियरिंग प्रैक्टिसेस को उल्लेखनीय रूप से बेहतर बना सकते हैं। इन तकनीकों को लगातार लागू करना मज़बूत और मेंटेन करने योग्य डेटा पाइपलाइंस सुनिश्चित करता है।
PySpark को और एक्सप्लोर करने के लिए हमारे इन-डेप्थ Spark कोर्सेज़ देखें, जिनमें शामिल हैं: