इस व्यापक उदाहरण में DataFrame.select
और DataFrame.rdd.map
के साथ तुलना में तेज़ होगा, मुझे लगता है कि अंतर लगभग नगण्य हो सकता है।
आखिरकार आपने अपना डेटा सेट पहले ही लोड कर लिया है और केवल प्रक्षेपण किया है। अंततः दोनों को कार्रवाई के परिणाम की गणना करने के लिए स्पार्क के InternalRow
स्तंभ प्रारूप से डेटा को deserialize करना होगा।
आप DataFrame.select
के साथ explain(extended = true)
पर क्या हो सकता है, जहां आप भौतिक योजनाओं (और एक भौतिक योजना भी) के बारे में जानेंगे।
scala> spark.version
res4: String = 2.1.0-SNAPSHOT
scala> spark.range(5).select('id).explain(extended = true)
== Parsed Logical Plan ==
'Project [unresolvedalias('id, None)]
+- Range (0, 5, step=1, splits=Some(4))
== Analyzed Logical Plan ==
id: bigint
Project [id#17L]
+- Range (0, 5, step=1, splits=Some(4))
== Optimized Logical Plan ==
Range (0, 5, step=1, splits=Some(4))
== Physical Plan ==
*Range (0, 5, step=1, splits=Some(4))
आप rdd.map
साथ क्या कर रहे हैं (toDebugString
द्वारा) करने के लिए भौतिक योजना (अर्थात SparkPlan
) की तुलना करें और आपको पता चल जाएगा कि क्या "बेहतर" हो सकता है।
scala> spark.range(5).rdd.toDebugString
res5: String =
(4) MapPartitionsRDD[8] at rdd at <console>:24 []
| MapPartitionsRDD[7] at rdd at <console>:24 []
| MapPartitionsRDD[6] at rdd at <console>:24 []
| MapPartitionsRDD[5] at rdd at <console>:24 []
| ParallelCollectionRDD[4] at rdd at <console>:24 []
(फिर से इस संक्रमित उदाहरण में मुझे लगता है कि कोई विजेता नहीं है - दोनों जितना संभव हो उतना कुशल हैं)।
कृपया ध्यान दें कि DataFrame
वास्तव में एक Dataset[Row]
जो RowEncoder
का उपयोग करता है एक InternalRow
स्तंभ द्विपदीय प्रारूप में डेटा एन्कोड करने के लिए (अर्थात serialize) है। यदि आप पाइपलाइन में अधिक ऑपरेटरों को निष्पादित करना चाहते थे, तो से पर चिपकने के साथ आप बेहतर प्रदर्शन कर सकते हैं क्योंकि निम्न स्तर के पीछे-दृश्य-दृश्य लॉजिकल क्वेरी प्लान ऑप्टिमाइज़ेशन और कॉलमर बाइनरी प्रारूप।
बहुत सारे अनुकूलन हैं और उन्हें हरा करने की कोशिश करने से अक्सर आपके समय का अपशिष्ट हो सकता है। बेहतर प्रदर्शन पाने के लिए आपको स्पार्क इंटर्नल्स को दिल से जानना होगा (और कीमत निश्चित रूप से पठनीयता होगी)।
इसके लिए बहुत कुछ है और मैं दृढ़ता से सभी अनुकूलन को जानने और सराहना करने के लिए हरमन वैन होवेल द्वारा A Deep Dive into the Catalyst Optimizer पर बात करने की सलाह देता हूं।
मेरा ले लेना है ... "आरडीडी से दूर रहें जबतक कि आप नहीं जानते कि आप क्या कर रहे हैं"।
सारांश में, 'डेटाफ्रेम' संचालन उनके 'rdd' समकक्षों की तुलना में हमेशा तेज़ होगा। – mtoto
@mtoto मैं ** ** ** सुनिश्चित नहीं होगा। डेटासेट को प्रसंस्करण के लिए डेटा को क्रमबद्ध और deserialize करना है + टाइप किए गए परिचालनों में स्कैला कोड और यूडीएफ अनुकूलन दूर कर सकते हैं (जो आरडीडी के लिए "खतरनाक" नहीं होगा)। –
@JacekLaskowski डेटासेट में खराब कोड आरडीडी में अच्छे कोड से धीमा हो सकता है;) हालांकि डेटासेट सादे आरडीडी से अधिक तेज़ होगा। और स्पार्क, एमएल और स्ट्रीमिंग में नए एपीआई से अवगत रहें डेटासेट-केंद्रित होने जा रहे हैं –