में कक्षाओं के मामले में लोडिंग लकड़ी की छत फ़ाइलों का प्रदर्शन मैं स्पार्क में लकड़ी की छत फ़ाइलों को लोड करने के विभिन्न तरीकों के प्रदर्शन का आकलन कर रहा हूं और अंतर चौंकाने वाला है।स्पार्क
प्रकार केहमारे लकड़ी फ़ाइलों में, हम नेस्ट है मामले कक्षाएं:
case class C(/* a dozen of attributes*/)
case class B(/* a dozen of attributes*/, cs: Seq[C])
case class A(/* a dozen of attributes*/, bs: Seq[B])
यह कुछ समय लगता है उन्हें लकड़ी फ़ाइलों से लोड करने के लिए। इसलिए मैंने पैराक्वेट फ़ाइलों से केस क्लास लोड करने और स्पार्क 1.6 और 2.0 का उपयोग करके फ़ील्ड को एकत्र करने के विभिन्न तरीकों का बेंचमार्क किया है। के बाद से Dataframe
अब Dataset[Row]
का एक मात्र अन्य नाम है,
val df: DataFrame = sqlContext.read.parquet("path/to/file.gz.parquet").persist()
df.count()
// Spark 1.6
// Play Json
// 63.169s
df.toJSON.flatMap(s => Try(Json.parse(s).as[A]).toOption)
.map(_.fieldToSum).sum()
// Direct access to field using Spark Row
// 2.811s
df.map(row => row.getAs[Long]("fieldToSum")).sum()
// Some small library we developed that access fields using Spark Row
// 10.401s
df.toRDD[A].map(_.fieldToSum).sum()
// Dataframe hybrid SQL API
// 0.239s
df.agg(sum("fieldToSum")).collect().head.getAs[Long](0)
// Dataset with RDD-style code
// 34.223s
df.as[A].map(_.fieldToSum).reduce(_ + _)
// Dataset with column selection
// 0.176s
df.as[A].select($"fieldToSum".as[Long]).reduce(_ + _)
// Spark 2.0
// Performance is similar except for:
// Direct access to field using Spark Row
// 23.168s
df.map(row => row.getAs[Long]("fieldToSum")).reduce(_ + _)
// Some small library we developed that access fields using Spark Row
// 32.898s
f1DF.toRDD[A].map(_.fieldToSum).sum()
मुझे समझ में क्यों स्पार्क पंक्ति का उपयोग कर विधियों में से प्रदर्शन जब 2.0 स्पार्क के उन्नयन अपमानित किया जाता है:
यहाँ बेंचमार्क मैंने किया था का सार है। इंटरफेस को एकीकृत करने की लागत है, मुझे लगता है। जब RDD शैली कोडिंग (map
और flatMap
रों) जब Dataframe
तरह Dataset
का उपयोग कर SQL जैसी डीएसएल के साथ से भी बदतर है का उपयोग करते हुए प्रदर्शन:
दूसरी ओर, मैं काफी निराश है कि Dataset
का वादा निभाया नहीं है कर रहा हूँ ।
असल में, अच्छा प्रदर्शन करने के लिए, हमें प्रकार की सुरक्षा छोड़नी होगी।
Dataframe
के रूप में इस्तेमाल RDD औरDataset
के रूप में इस्तेमालDataset
के बीच इस तरह के अंतर की वजह क्या है?क्या आरडीडी-शैली कोडिंग और एसक्यूएल-शैली कोडिंग प्रदर्शन को समतुल्य करने के लिए
Dataset
में एन्कोडिंग प्रदर्शन में सुधार करने का कोई तरीका है? डेटा इंजीनियरिंग के लिए, आरडीडी-शैली कोडिंग के लिए यह बहुत साफ है।इसके अलावा, एसक्यूएल-जैसे डीएसएल के साथ काम करने के लिए हमारे डेटा मॉडल को फ़्लैट करना होगा और नेस्टेड केस क्लासेस का उपयोग नहीं करना होगा। क्या मैं सही हूं कि अच्छा प्रदर्शन केवल फ्लैट डेटा मॉडल के साथ हासिल किया जाता है?
मैं स्पार्क इंटरफेस में पर्याप्त delved नहीं था फिर भी, 'df.rdd.map (row => row.getAs [long] ("fieldToSum"))। (_ + _) 'और' df.map (row => row.getAs [long] ("fieldToSum को कम करें) "))। कम करें (_ + _) 'मोटे तौर पर एक ही प्रदर्शन है। प्रदर्शन को बनाए रखने के लिए पुराने तंत्र पर वापस जाने का कोई तरीका नहीं है? – jrjd
कोई भी जो मुझे पता है लेकिन निष्पक्ष होने के लिए मुझे यकीन नहीं है कि इस विशेष मामले में अपराधी क्या है और मैं वास्तव में वास्तव में इस तरह के अंतर को पुन: उत्पन्न नहीं कर सकता। हालांकि यह dev सूची के लिए अग्रेषित लायक हो सकता है। – zero323