मैं बस सोच रहा हूँ एक के बीच अंतर क्या है RDD
और DataFrame
(स्पार्क 2.0.0 DataFrame के लिए एक मात्र प्रकार अन्य नाम है Dataset[Row]
) अपाचे स्पार्क में?
क्या आप एक को दूसरे में बदल सकते हैं?
मैं बस सोच रहा हूँ एक के बीच अंतर क्या है RDD
और DataFrame
(स्पार्क 2.0.0 DataFrame के लिए एक मात्र प्रकार अन्य नाम है Dataset[Row]
) अपाचे स्पार्क में?
क्या आप एक को दूसरे में बदल सकते हैं?
जवाबों:
A DataFrame
को "DataFrame परिभाषा" के लिए एक Google खोज के साथ अच्छी तरह से परिभाषित किया गया है:
डेटा फ़्रेम एक तालिका, या दो-आयामी सरणी जैसी संरचना है, जिसमें प्रत्येक कॉलम में एक चर पर माप होता है, और प्रत्येक पंक्ति में एक मामला होता है।
तो, DataFrame
इसके सारणीबद्ध प्रारूप के कारण अतिरिक्त मेटाडेटा है, जो स्पार्क को अंतिम रूप से क्वेरी पर कुछ अनुकूलन चलाने की अनुमति देता है।
एक RDD
ओर, दूसरी ओर, केवल एक R esilient D istributed D ataset है जो कि डेटा के एक ब्लैकबॉक्स से अधिक है जो कि इसके खिलाफ किए जा सकने वाले ऑपरेशन के रूप में अनुकूलित नहीं किया जा सकता है, उतने विवश नहीं हैं।
हालांकि, अगर आप एक के लिए एक DataFrame से जा सकते हैं RDD
इसके माध्यम से rdd
विधि है, और आप एक से जा सकते हैं RDD
एक करने के लिए DataFrame
के माध्यम से (यदि RDD तालिका स्वरूप में है) toDF
विधि
सामान्य तौर पर इसे DataFrame
बिल्ट ऑप्टिमाइज़ेशन के कारण जहाँ संभव हो उपयोग करने की सलाह दी जाती है ।
पहली बात
DataFrame
इससे विकसित हुई थीSchemaRDD
।
हाँ .. के बीच रूपांतरण Dataframe
और RDD
बिल्कुल संभव है।
नीचे कुछ सैंपल कोड स्निपेट दिए गए हैं।
df.rdd
है RDD[Row]
डाटाफ्रेम बनाने के लिए नीचे कुछ विकल्प दिए गए हैं।
1) में yourrddOffrow.toDF
धर्मान्तरित DataFrame
।
2) createDataFrame
एसक्यूएल संदर्भ का उपयोग करना
val df = spark.createDataFrame(rddOfRow, schema)
जहाँ स्कीमा नीचे दिए गए विकल्पों में से कुछ से हो सकता है जैसा कि अच्छा SO पोस्ट द्वारा वर्णित है ..
स्कैला केस क्लास और स्काला रिफ्लेक्शन एपी सेimport org.apache.spark.sql.catalyst.ScalaReflection val schema = ScalaReflection.schemaFor[YourScalacaseClass].dataType.asInstanceOf[StructType]
या उपयोग कर रहा है
Encoders
import org.apache.spark.sql.Encoders val mySchema = Encoders.product[MyCaseClass].schema
जैसा कि स्कीमा द्वारा वर्णित है, का उपयोग करके भी बनाया जा सकता है
StructType
औरStructField
val schema = new StructType() .add(StructField("id", StringType, true)) .add(StructField("col1", DoubleType, true)) .add(StructField("col2", DoubleType, true)) etc...
वास्तव में अब 3 अपाचे स्पार्क एपीआई हैं ..
RDD
एपीआई:
RDD
(लचीला वितरित डेटासेट) एपीआई स्पार्क में 1.0 रिलीज के बाद से किया गया है।
RDD
एपीआई जैसे कई परिवर्तन के तरीकों, प्रदान करता हैmap
(),filter
) (, औरreduce
() के आंकड़ों पर संगणना प्रदर्शन करने के लिए। इन तरीकों में से प्रत्येक एक नएRDD
रूपांतरित डेटा का प्रतिनिधित्व करता है। हालाँकि, ये विधियाँ बस किए जाने वाले कार्य को परिभाषित कर रही हैं और जब तक कि क्रिया विधि नहीं कहलाती तब तक रूपांतरण नहीं किए जाते हैं। कार्रवाई के तरीकों के उदाहरण हैंcollect
() औरsaveAsObjectFile
()।
RDD उदाहरण:
rdd.filter(_.age > 21) // transformation
.map(_.last)// transformation
.saveAsObjectFile("under21.bin") // action
उदाहरण: RDD के साथ विशेषता द्वारा फ़िल्टर
rdd.filter(_.age > 21)
DataFrame
एपीआईस्पार्क 1.3 ने
DataFrame
प्रोजेक्ट टंगस्टन पहल के हिस्से के रूप में एक नया एपीआई पेश किया जो स्पार्क के प्रदर्शन और स्केलेबिलिटी में सुधार करना चाहता है।DataFrame
API का परिचय एक स्कीमा की अवधारणा डेटा का वर्णन, स्कीमा का प्रबंधन करने के लिए और केवल नोड्स के बीच डेटा पास, जावा क्रमबद्धता का उपयोग कर की तुलना में काफी अधिक कुशल तरीके से स्पार्क की इजाजत दी।
DataFrame
एपीआई से बिल्कुल भिन्न हैRDD
, क्योंकि यह एक रिलेशनल क्वेरी योजना है कि स्पार्क का उत्प्रेरक अनुकूलक तो निष्पादित कर सकते हैं के निर्माण के लिए एक API है एपीआई। एपीआई उन डेवलपर्स के लिए स्वाभाविक है जो क्वेरी योजनाओं के निर्माण से परिचित हैं
उदाहरण एसक्यूएल शैली:
df.filter("age > 21");
सीमाएं: क्योंकि कोड नाम से डेटा विशेषताओं का उल्लेख कर रहा है, इसलिए कंपाइलर के लिए किसी भी त्रुटि को पकड़ना संभव नहीं है। यदि विशेषता नाम गलत हैं, तो त्रुटि केवल रनटाइम पर पता चलेगी, जब क्वेरी योजना बनाई जाती है।
DataFrame
एपीआई के साथ एक और नकारात्मक पहलू यह है कि यह बहुत स्केला-केंद्रित है और जब यह जावा का समर्थन करता है, तो समर्थन सीमित है।
उदाहरण के लिए, DataFrame
किसी RDD
जावा ऑब्जेक्ट से मौजूदा बनाने पर , स्पार्क के कैटलिस्ट ऑप्टिमाइज़र स्कीमा का अनुमान नहीं लगा सकते हैं और मान लेते हैं कि डेटाफ़्रेम में कोई भी ऑब्जेक्ट scala.Product
इंटरफ़ेस को लागू करता है। स्काला case class
बॉक्स का काम करता है क्योंकि वे इस इंटरफ़ेस को लागू करते हैं।
Dataset
एपीआई
Dataset
एपीआई, स्पार्क 1.6 में एक API पूर्वावलोकन के रूप में जारी की है, दोनों दुनिया के सर्वश्रेष्ठ प्रदान करना है; परिचित वस्तु-उन्मुख प्रोग्रामिंग शैली औरRDD
एपीआई के संकलन-समय-प्रकार की सुरक्षा लेकिन उत्प्रेरक क्वेरी ऑप्टिमाइज़र के प्रदर्शन लाभ के साथ। डेटासेट भीDataFrame
एपीआई के समान कुशल ऑफ-हीप स्टोरेज तंत्र का उपयोग करता है।जब डेटा को क्रमबद्ध करने की बात आती है, तो
Dataset
एपीआई में एनकोडर की अवधारणा होती है जो जेवीएम अभ्यावेदन (ऑब्जेक्ट) और स्पार्क के आंतरिक बाइनरी प्रारूप के बीच अनुवाद करती है। स्पार्क में बिल्ट-इन एन्कोडर हैं जो बहुत उन्नत हैं जिसमें वे ऑफ-हाइप डेटा के साथ इंटरैक्ट करने के लिए बाइट कोड उत्पन्न करते हैं और एक पूरे ऑब्जेक्ट को डी-सीरियल किए बिना व्यक्तिगत विशेषताओं तक ऑन-डिमांड एक्सेस प्रदान करते हैं। स्पार्क अभी तक कस्टम एनकोडर को लागू करने के लिए एक एपीआई प्रदान नहीं करता है, लेकिन यह भविष्य के रिलीज के लिए योजनाबद्ध है।इसके अतिरिक्त,
Dataset
एपीआई को जावा और स्काला दोनों के साथ समान रूप से अच्छी तरह से काम करने के लिए डिज़ाइन किया गया है। जावा ऑब्जेक्ट के साथ काम करते समय, यह महत्वपूर्ण है कि वे पूरी तरह से सेम-कंप्लेंट हैं।
उदाहरण Dataset
API SQL शैली:
dataset.filter(_.age < 21);
मूल्यांकन अलग। DataFrame
और के बीच DataSet
:
कैटालिस्ट स्तर का प्रवाह। । (स्पार्क शिखर सम्मेलन से डेटाफ़्रेम और डेटासेट प्रस्तुति का प्रदर्शन
आगे पढें ... डेटाब्रिक्स लेख - ए टेल ऑफ़ थ्री अपाचे स्पार्क एपीआई: आरडीडी बनाम डेटाफ्रेम और डेटासेट
df.filter("age > 21");
इसका मूल्यांकन केवल रन टाइम में किया जा सकता है। अपनी स्ट्रिंग के बाद से। डेटासैट के इनसेट, डेटासैट सेम कंप्लेंट हैं। इसलिए उम्र सेम संपत्ति है। यदि आपके बीन में उम्र की संपत्ति नहीं है, तो आपको जल्दी (यानी dataset.filter(_.age < 21);
) संकलन समय में पता चल जाएगा । विश्लेषण त्रुटि को मूल्यांकन त्रुटियों के रूप में बदला जा सकता है।
अपाचे स्पार्क तीन प्रकार के एपीआई प्रदान करता है
यहाँ RDD, डेटाफ्रेम और डेटासेट के बीच API की तुलना की गई है।
मुख्य अमूर्त स्पार्क प्रदान करता है एक लचीली वितरित डेटासेट (RDD) है, जो कि क्लस्टर के नोड्स में विभाजित किए गए तत्वों का एक संग्रह है जिसे समानांतर में संचालित किया जा सकता है।
वितरित संग्रह:
RDD MapReduce के संचालन का उपयोग करता है, जो एक क्लस्टर पर समानांतर, वितरित एल्गोरिदम के साथ बड़े डेटासेट को संसाधित करने और उत्पन्न करने के लिए व्यापक रूप से अपनाया जाता है। यह उपयोगकर्ताओं को काम वितरण और गलती सहिष्णुता के बारे में चिंता किए बिना, उच्च-स्तरीय ऑपरेटरों के एक सेट का उपयोग करके, समानांतर संगणना लिखने की अनुमति देता है।
अपरिवर्तनीय: RDD रिकॉर्ड्स के एक संग्रह से बना होता है जो कि विभाजन होता है। एक विभाजन RDD में समानांतरवाद की एक बुनियादी इकाई है, और प्रत्येक विभाजन डेटा का एक तार्किक विभाजन है जो अपरिवर्तनीय है और मौजूदा विभाजनों पर कुछ परिवर्तनों के माध्यम से बनाया गया है। Immutability संगणना में स्थिरता प्राप्त करने में मदद करता है।
दोष सहिष्णु: अगर हम RDD के कुछ विभाजन को खो देते हैं, तो हम एक ही गणना को प्राप्त करने के लिए वंश में उस विभाजन पर हुए परिवर्तन को फिर से दोहरा सकते हैं, बल्कि कई नोड्स में डेटा प्रतिकृति कर सकते हैं। यह विशेषता RDD का सबसे बड़ा लाभ है क्योंकि यह बचाता है डेटा प्रबंधन और प्रतिकृति में प्रयासों और इस प्रकार का एक बहुत तेजी से संगणना प्राप्त होता है।
आलसी मूल्यांकन: स्पार्क में सभी परिवर्तन आलसी हैं, इसमें वे तुरंत अपने परिणामों की गणना नहीं करते हैं। इसके बजाय, वे कुछ आधार डाटासेट के लिए लागू परिवर्तनों याद है। परिवर्तनों की गणना केवल तब की जाती है जब किसी क्रिया को ड्राइवर प्रोग्राम में वापस करने की आवश्यकता होती है।
कार्यात्मक रूपांतरण: आरडीडी दो प्रकार के संचालन का समर्थन करते हैं: परिवर्तन, जो एक मौजूदा से एक नया डेटासेट बनाते हैं, और क्रियाएं, जो डेटासेट पर एक संगणना चलाने के बाद ड्राइवर प्रोग्राम के लिए एक मान लौटाती हैं।
डेटा प्रोसेसिंग प्रारूप:
यह आसानी से और कुशलता से डेटा को प्रोसेस कर सकता है जो संरचित के साथ-साथ अनस्ट्रक्चर्ड डेटा भी है।
प्रोग्रामिंग भाषा समर्थित:
RDD एपीआई जावा, स्काला, पायथन और आर में उपलब्ध है।
इनबिल्ट ऑप्टिमाइज़ेशन इंजन नहीं: संरचित डेटा के साथ काम करते समय, RDD उत्प्रेरक एडवांटेज और टंगस्टन निष्पादन इंजन सहित स्पार्क के उन्नत ऑप्टिमाइज़र का लाभ नहीं ले सकता है। डेवलपर्स को अपनी विशेषताओं के आधार पर प्रत्येक RDD का अनुकूलन करने की आवश्यकता होती है।
संरचित डेटा को संभालना: डेटाफ्रेम और डेटासेट के विपरीत, RDD इनग्रेस्ड डेटा के स्कीमा का अनुमान नहीं लगाते हैं और उपयोगकर्ता को इसे निर्दिष्ट करने की आवश्यकता होती है।
स्पार्क ने स्पार्क 1.3 रिलीज में डेटाफ्रेम पेश किया। आरडीडी के पास प्रमुख चुनौतियां हैं।
एक DataFrame नाम स्तंभों में आयोजित डेटा का एक वितरित संग्रह है। यह एक संबंधपरक डेटाबेस या आर / पायथन डेटाफ्रेम में तालिका के समतुल्य है। डेटाफ्रेम के साथ, स्पार्क ने उत्प्रेरक ऑप्टिमाइज़र भी पेश किया, जो एक एक्स्टेंसिबल क्वेरी ऑप्टिमाइज़र बनाने के लिए उन्नत प्रोग्रामिंग सुविधाओं का लाभ उठाता है।
पंक्ति वस्तु का वितरित संग्रह: एक डेटाफ़्रेम नाम स्तंभों में आयोजित डेटा का एक वितरित संग्रह है। यह एक संबंधपरक डेटाबेस में तालिका के समतुल्य है, लेकिन हुड के तहत समृद्ध अनुकूलन के साथ।
डेटा प्रसंस्करण: संरचित और असंरचित डेटा प्रारूप (एवरो, सीएसवी, लोचदार खोज, और कैसेंड्रा) और भंडारण प्रणाली (एचडीएफएस, एचआईईवी टेबल, MySQL, आदि) प्रसंस्करण। यह इन सभी विभिन्न डेटा स्रोतों से पढ़ और लिख सकता है।
उत्प्रेरक ऑप्टिमाइज़र का उपयोग करके अनुकूलन: यह SQL क्वेरी और DataFrame API दोनों को अधिकार देता है। डेटाफ्रेम चार चरणों में उत्प्रेरक वृक्ष परिवर्तन ढांचे का उपयोग करते हैं,
1.Analyzing a logical plan to resolve references
2.Logical plan optimization
3.Physical planning
4.Code generation to compile parts of the query to Java bytecode.
हाइव संगतता: स्पार्क एसक्यूएल का उपयोग करना, आप अपने मौजूदा हाइव गोदामों पर असंशोधित हाइव क्वेरी चला सकें। यह हाइव फ्रंटएंड और मेटास्टोर का पुन: उपयोग करता है और आपको मौजूदा हाइव डेटा, प्रश्नों और यूडीएफ के साथ पूर्ण अनुकूलता प्रदान करता है।
टंगस्टन: टंगस्टन एक भौतिक निष्पादन बैकएंड प्रदान करता है जो कि स्मृति का प्रबंधन करता है और अभिव्यक्ति मूल्यांकन के लिए गतिशील रूप से बायटेकोड उत्पन्न करता है।
प्रोग्रामिंग लैंग्वेज सपोर्टेड:
डेटाफ्रेम एपीआई जावा, स्काला, पायथन और आर में उपलब्ध है।
उदाहरण:
case class Person(name : String , age : Int)
val dataframe = sqlContext.read.json("people.json")
dataframe.filter("salary > 10000").show
=> throws Exception : cannot resolve 'salary' given input age , name
यह विशेष रूप से चुनौतीपूर्ण है जब आप कई परिवर्तन और एकत्रीकरण चरणों के साथ काम कर रहे हैं।
उदाहरण:
case class Person(name : String , age : Int)
val personRDD = sc.makeRDD(Seq(Person("A",10),Person("B",20)))
val personDF = sqlContext.createDataframe(personRDD)
personDF.rdd // returns RDD[Row] , does not returns RDD[Person]
डेटासेट एपीआई डेटाफ़्रेम का एक विस्तार है जो एक प्रकार-सुरक्षित, ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग इंटरफ़ेस प्रदान करता है। यह एक दृढ़ता से टाइप की गई, अपरिवर्तनीय वस्तुओं का संग्रह है जो एक संबंधपरक स्कीमा में मैप किया जाता है।
डेटासेट के मूल में, एपीआई एक नई अवधारणा है जिसे एनकोडर कहा जाता है, जो जेवीएम ऑब्जेक्ट्स और टेबलुलर प्रतिनिधित्व के बीच कनवर्ट करने के लिए जिम्मेदार है। सारणीबद्ध आंतरिक टंगस्टन बाइनरी प्रारूप का उपयोग करते हुए सारणीबद्ध प्रतिनिधित्व को संग्रहीत किया जाता है, क्रमबद्ध डेटा पर संचालन और बेहतर स्मृति उपयोग के लिए अनुमति देता है। स्पार्क 1.6 आदिम प्रकार (जैसे स्ट्रिंग, इंटेगर, लॉन्ग), स्काला केस क्लासेस और जावा बीन्स सहित विभिन्न प्रकार के लिए स्वचालित रूप से एन्कोडर बनाने के लिए समर्थन के साथ आता है।
RDD और डेटाफ़्रेम दोनों का सर्वोत्तम प्रदान करता है: RDD (कार्यात्मक प्रोग्रामिंग, प्रकार सुरक्षित), DataFrame (संबंधपरक मॉडल, क्वेरी ऑप्टिमाइज़ेशन, टंगस्टन निष्पादन, सॉर्टिंग और फेरबदल)
इनकोडर्स: इनकोडर्स के उपयोग के साथ, यह एक डेटासेट में किसी भी JVM वस्तु कन्वर्ट करने के लिए, Dataframe के विपरीत दोनों संरचित और असंरचित डेटा के साथ काम करने के लिए उपयोगकर्ताओं की अनुमति के लिए आसान है।
प्रोग्रामिंग भाषाएँ समर्थित: डेटासेट एपीआई वर्तमान में केवल स्काला और जावा में उपलब्ध है। पायथन और आर वर्तमान में संस्करण 1.6 में समर्थित नहीं हैं। पायथन समर्थन संस्करण 2.0 के लिए स्लेटेड है।
प्रकार की सुरक्षा: डेटासेट एपीआई संकलन समय सुरक्षा प्रदान करता है जो डेटाफ्रेम में उपलब्ध नहीं था। नीचे दिए गए उदाहरण में, हम देख सकते हैं कि डेटासेट संकलित लैम्ब्डा कार्यों के साथ डोमेन ऑब्जेक्ट पर कैसे काम कर सकता है।
उदाहरण:
case class Person(name : String , age : Int)
val personRDD = sc.makeRDD(Seq(Person("A",10),Person("B",20)))
val personDF = sqlContext.createDataframe(personRDD)
val ds:Dataset[Person] = personDF.as[Person]
ds.filter(p => p.age > 25)
ds.filter(p => p.salary > 25)
// error : value salary is not a member of person
ds.rdd // returns RDD[Person]
उदाहरण:
ds.select(col("name").as[String], $"age".as[Int]).collect()
पायथन और आर के लिए कोई समर्थन नहीं: जारी 1.6 के रूप में, डेटासेट केवल स्काला और जावा का समर्थन करता है। स्पार्क 2.0 में पायथन सपोर्ट पेश किया जाएगा।
डेटासेट एपीआई मौजूदा आरडीडी और डेटाफ़्रेम एपीआई पर बेहतर प्रकार की सुरक्षा और कार्यात्मक प्रोग्रामिंग के साथ कई फायदे लाता है। एपीआई में टाइप कास्टिंग आवश्यकताओं की चुनौती, आप अभी भी आवश्यक प्रकार की सुरक्षा नहीं करेंगे और अपने कोड को भंगुर बना देंगे।
Dataset
LINQ नहीं है और लैम्ब्डा एक्सप्रेशन को एक्सप्रेशन ट्री के रूप में व्याख्यायित नहीं किया जा सकता है। इसलिए, ब्लैक बॉक्स हैं, और आप सभी (यदि सभी नहीं) ऑप्टिमाइज़र लाभ के बहुत ढीले हैं। संभावित डाउनसाइड्स का बस एक छोटा सा उप-समूह: स्पार्क 2.0 डेटासेट बनाम डाटाफ्रेम । इसके अलावा, बस कुछ दोहराने के लिए मैंने कई बार कहा - सामान्य रूप से एंड-टू-एंड प्रकार की जाँच Dataset
एपीआई के साथ संभव नहीं है । जॉइन केवल सबसे प्रमुख उदाहरण हैं।
RDD
RDD
उन तत्वों का दोष-सहिष्णु संग्रह है जिन्हें समानांतर में संचालित किया जा सकता है।
DataFrame
DataFrame
एक डेटासेट नामांकित कॉलम में व्यवस्थित है। यह एक संबंधपरक डेटाबेस या आर / पायथन में एक डेटा फ्रेम की मेज के बराबर है, लेकिन हुड के तहत समृद्ध अनुकूलन के साथ ।
Dataset
Dataset
डेटा का एक वितरित संग्रह है। डेटासेट स्पार्क 1.6 में जोड़ा गया एक नया इंटरफ़ेस है जो स्पार्क एसक्यूएल के अनुकूलित निष्पादन इंजन के लाभों के साथ आरडीडी (मजबूत टाइपिंग, शक्तिशाली लैम्ब्डा कार्यों का उपयोग करने की क्षमता) के लाभ प्रदान करता है ।
ध्यान दें:
Dataset[Row]
स्काला / जावा में पंक्तियों के डेटासेट ( ) अक्सर डेटाफ़्रेम के रूप में संदर्भित होंगे ।
Nice comparison of all of them with a code snippet.
प्रश्न: क्या आप एक को RDD की तरह डेटाफ्रेम या इसके विपरीत में बदल सकते हैं?
1. RDD
के DataFrame
साथ.toDF()
val rowsRdd: RDD[Row] = sc.parallelize(
Seq(
Row("first", 2.0, 7.0),
Row("second", 3.5, 2.5),
Row("third", 7.0, 5.9)
)
)
val df = spark.createDataFrame(rowsRdd).toDF("id", "val1", "val2")
df.show()
+------+----+----+
| id|val1|val2|
+------+----+----+
| first| 2.0| 7.0|
|second| 3.5| 2.5|
| third| 7.0| 5.9|
+------+----+----+
अधिक तरीके: स्पार्क में डेटाफ्रेम में आरडीडी ऑब्जेक्ट कन्वर्ट करें
2. DataFrame
/ DataSet
करने RDD
के साथ .rdd()
विधि
val rowsRdd: RDD[Row] = df.rdd() // DataFrame to RDD
क्योंकि DataFrame
कमजोर रूप से टाइप किया गया है और डेवलपर्स को टाइप सिस्टम का लाभ नहीं मिल रहा है। उदाहरण के लिए, आप SQL से कुछ पढ़ना चाहते हैं और उस पर कुछ एकत्रीकरण चलाना चाहते हैं:
val people = sqlContext.read.parquet("...")
val department = sqlContext.read.parquet("...")
people.filter("age > 30")
.join(department, people("deptId") === department("id"))
.groupBy(department("name"), "gender")
.agg(avg(people("salary")), max(people("age")))
जब आप कहते हैं people("deptId")
, आप वापस नहीं आ रहे हैं Int
, या ए Long
, तो आपको एक Column
वस्तु वापस मिल रही है, जिस पर आपको काम करना है। स्कैला जैसी समृद्ध प्रकार की प्रणालियों वाली भाषाओं में, आप सभी प्रकार की सुरक्षा खो देते हैं, जो उन चीजों के लिए रन-टाइम त्रुटियों की संख्या को बढ़ा देती है जिन्हें संकलन समय पर खोजा जा सकता था।
इसके विपरीत, DataSet[T]
टाइप किया जाता है। जब तुम करोगे:
val people: People = val people = sqlContext.read.parquet("...").as[People]
आप वास्तव में एक People
वस्तु वापस पा रहे हैं , जहां deptId
एक वास्तविक अभिन्न प्रकार है और स्तंभ प्रकार नहीं है, इस प्रकार प्रकार प्रणाली का लाभ उठा रहा है।
स्पार्क 2.0 के रूप में, डेटाफ्रेम और डेटासेट एपीआई को एकीकृत किया जाएगा, जहां के DataFrame
लिए एक प्रकार का उपनाम होगा DataSet[Row]
।
DataFrame
एपीआई बदलावों को तोड़ने से बचना था। वैसे भी, बस इसे इंगित करना चाहता था। मेरे लिए संपादन और उत्थान के लिए धन्यवाद।
बस RDD
कोर घटक है, लेकिन DataFrame
एक एपीआई स्पार्क 1.30 में शुरू किया गया है।
डेटा विभाजन का संग्रह RDD
। ये RDD
कुछ गुणों का पालन करना चाहिए:
यहाँ RDD
या तो संरचित या असंरचित है।
DataFrame
Scala, Java, Python और R में उपलब्ध API है। यह किसी भी प्रकार के स्ट्रक्चर्ड और सेमी स्ट्रक्चर्ड डेटा को प्रोसेस करने की अनुमति देता है। परिभाषित करने के लिए DataFrame
, वितरित डेटा का एक संग्रह जिसे नामित कॉलम में व्यवस्थित किया गया है DataFrame
। आप आसानी से अनुकूलन कर सकते हैं RDDs
में DataFrame
। आप एक बार में JSON डेटा, लकड़ी की छत डेटा, HiveQL डेटा का उपयोग करके प्रक्रिया कर सकते हैं DataFrame
।
val sampleRDD = sqlContext.jsonFile("hdfs://localhost:9000/jsondata.json")
val sample_DF = sampleRDD.toDF()
यहाँ नमूना_डीएफ पर विचार करें DataFrame
। sampleRDD
(कच्चे डेटा) कहा जाता है RDD
।
अधिकांश उत्तर सही हैं केवल एक बिंदु को यहां जोड़ना चाहते हैं
स्पार्क 2.0 में दो API (DataFrame + DataSet) को एक साथ एक एपीआई में एकीकृत किया जाएगा।
"डेटाफ़्रेम और डेटासेट को एकीकृत करना: स्काला और जावा में, डेटाफ़्रेम और डेटासेट को एकीकृत किया गया है, अर्थात डेटाफ़्रेम, डेटा डेट के लिए रो का केवल एक प्रकार का उपनाम है। पायथन और आर में, टाइप सुरक्षा की कमी को देखते हुए, डेटाफ़्रेम मुख्य प्रोग्रामिंग इंटरफ़ेस है।"
डेटासेट आरडीडी के समान हैं, हालांकि, जावा सीरियललाइज़ेशन या क्रियो का उपयोग करने के बजाय वे नेटवर्क पर प्रसंस्करण या संचारित करने के लिए वस्तुओं को अनुक्रमित करने के लिए एक विशेष एनकोडर का उपयोग करते हैं।
स्पार्क एसक्यूएल मौजूदा आरडीडी को डेटासेट में बदलने के लिए दो अलग-अलग तरीकों का समर्थन करता है। पहली विधि एक RDD के स्कीमा को खोजने के लिए प्रतिबिंब का उपयोग करती है जिसमें विशिष्ट प्रकार की वस्तुएं होती हैं। यह प्रतिबिंब आधारित दृष्टिकोण अधिक संक्षिप्त कोड की ओर जाता है और अच्छी तरह से काम करता है जब आप अपने स्पार्क एप्लिकेशन को लिखते समय स्कीमा को जानते हैं।
डेटासेट बनाने के लिए दूसरी विधि एक प्रोग्रामेटिक इंटरफ़ेस के माध्यम से है जो आपको एक स्कीमा बनाने की अनुमति देती है और फिर इसे एक मौजूदा आरडीडी पर लागू करती है। जबकि यह विधि अधिक क्रिया है, यह आपको डेटासैट के निर्माण की अनुमति देता है जब कॉलम और उनके प्रकार रनटाइम तक ज्ञात नहीं होते हैं।
यहां आप RDD टोफ़ डेटा फ़्रेम वार्तालाप उत्तर पा सकते हैं
एक DataFrame RDBMS में एक तालिका के बराबर है और इसे RDD में "मूल" वितरित संग्रह के समान तरीकों से भी हेरफेर किया जा सकता है। आरडीडी के विपरीत, डेटाफ्रेम स्कीमा का ट्रैक रखते हैं और विभिन्न रिलेशनल ऑपरेशंस का समर्थन करते हैं जो अधिक अनुकूलित निष्पादन का नेतृत्व करते हैं। प्रत्येक DataFrame ऑब्जेक्ट एक तार्किक योजना का प्रतिनिधित्व करता है, लेकिन उनके "आलसी" प्रकृति के कारण कोई निष्पादन तब तक नहीं होता है जब तक कि उपयोगकर्ता एक विशिष्ट "आउटपुट ऑपरेशन" को कॉल नहीं करता है।
मुझे उम्मीद है यह मदद करेगा!
एक डेटाफ़्रेम रो वस्तुओं का एक RDD है, प्रत्येक एक रिकॉर्ड का प्रतिनिधित्व करता है। एक डेटाफ़्रेम भी अपनी पंक्तियों के स्कीमा (यानी, डेटा फ़ील्ड) को जानता है। जबकि डेटाफ्रेम नियमित आरडीडी की तरह दिखते हैं, आंतरिक रूप से वे डेटा को अधिक कुशल तरीके से संग्रहीत करते हैं, अपने स्कीमा का लाभ उठाते हैं। इसके अलावा, वे RDDs पर उपलब्ध नए संचालन प्रदान नहीं करते हैं, जैसे कि SQL क्वेरी को चलाने की क्षमता। डेटाफ्रेम बाहरी डेटा स्रोतों से, प्रश्नों के परिणामों से या नियमित RDDs से बनाया जा सकता है।
संदर्भ: ज़हरिया एम।, एट अल। लर्निंग स्पार्क (ओ'रेली, 2015)
Spark RDD (resilient distributed dataset)
:
RDD कोर डेटा एब्स्ट्रैक्शन एपीआई है और स्पार्क (स्पार्क 1.0) के पहले रिलीज के बाद से उपलब्ध है। यह डेटा के वितरित संग्रह में हेरफेर करने के लिए एक निम्न-स्तरीय एपीआई है। RDD एपीआई कुछ अत्यंत उपयोगी तरीकों को उजागर करता है जिनका उपयोग अंतर्निहित भौतिक डेटा संरचना पर बहुत तंग नियंत्रण प्राप्त करने के लिए किया जा सकता है। यह विभिन्न मशीनों पर वितरित डेटा का एक अपरिवर्तनीय (केवल पढ़ने के लिए) संग्रह है। RDD बड़े डेटा समूहों में मेमोरी टॉलरेंट तरीके से बड़े डेटा प्रोसेसिंग को गति देने के लिए इन-मेमोरी गणना को सक्षम बनाता है। दोष सहिष्णुता को सक्षम करने के लिए, आरडीडी डीएजी (डायरेक्टेड एसाइक्लिक ग्राफ) का उपयोग करता है जिसमें कोने और किनारों का एक सेट होता है। DAG में कोने और किनारे क्रमशः RDD और उस RDD पर लागू किए जाने वाले ऑपरेशन का प्रतिनिधित्व करते हैं। आरडीडी पर परिभाषित परिवर्तन आलसी हैं और केवल तभी निष्पादित होते हैं जब कोई कार्रवाई की जाती है
Spark DataFrame
:
स्पार्क 1.3 ने दो नए डेटा एब्स्ट्रक्शन एपीआई - डेटाफ्रेम और डेटासेट पेश किए। DataFrame API डेटा को रिलेशनल डेटाबेस में टेबल की तरह नामित कॉलम में व्यवस्थित करता है। यह प्रोग्रामर को डेटा के वितरित संग्रह पर स्कीमा को परिभाषित करने में सक्षम बनाता है। DataFrame में प्रत्येक पंक्ति ऑब्जेक्ट प्रकार पंक्ति की है। SQL तालिका की तरह, प्रत्येक स्तंभ में DataFrame की समान पंक्तियाँ होनी चाहिए। संक्षेप में, DataFrame आलसी मूल्यांकन योजना है जो डेटा के वितरित संग्रह पर किए जाने वाले संचालन की आवश्यकता को निर्दिष्ट करती है। DataFrame भी एक अपरिवर्तनीय संग्रह है।
Spark DataSet
:
डेटाफ्रेम एपीआई के विस्तार के रूप में, स्पार्क 1.3 ने डेटासेट एपीआई भी पेश किया जो स्पार्क में कड़ाई से टाइप और ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग इंटरफ़ेस प्रदान करता है। यह वितरित डेटा का अपरिवर्तनीय, प्रकार-सुरक्षित संग्रह है। DataFrame की तरह, DataSet API निष्पादन अनुकूलन को सक्षम करने के लिए उत्प्रेरक इंजन का भी उपयोग करता है। DataSet DataFrame API का एक एक्सटेंशन है।
Other Differences
-
एक DataFrame एक RDD है जिसमें एक स्कीमा है। आप इसे एक रिलेशनल डेटाबेस टेबल के रूप में सोच सकते हैं, जिसमें प्रत्येक कॉलम में एक नाम और एक ज्ञात प्रकार होता है। DataFrames की शक्ति इस तथ्य से आती है कि, जब आप संरचित डेटासेट (Json, Parquet ..) से DataFrame बनाते हैं, तो स्पार्क संपूर्ण (Json, Parat ..) डेटासेट पर एक पास बनाकर एक स्कीमा को खोजने में सक्षम होता है। लोड किया जा रहा है। फिर, निष्पादन योजना की गणना करते समय, स्पार्क, स्कीमा का उपयोग कर सकते हैं और बेहतर संगणना अनुकूलन कर सकते हैं। ध्यान दें कि स्पार्क v1.3.0 से पहले डेटाफ्रैम को स्कीमाआरडीडी कहा जाता था
स्पार्क आरडीडी -
एक RDD का मतलब है रिसिलिएंट डिस्ट्रीब्यूटेड डेटासेट्स। यह केवल रिकॉर्ड का विभाजन संग्रह है। RDD स्पार्क की मूलभूत डेटा संरचना है। यह एक प्रोग्रामर को बड़े-बड़े समूहों में इन-मेमोरी कम्प्यूटेशन को फॉल्ट-टॉलरेंट तरीके से करने की अनुमति देता है। इस प्रकार, कार्य को गति दें।
स्पार्क डेटाफ़्रेम -
RDD के विपरीत, नामित स्तंभों में डेटा का आयोजन किया जाता है। उदाहरण के लिए एक संबंधपरक डेटाबेस में एक तालिका। यह डेटा का एक अपरिवर्तित वितरित संग्रह है। स्पार्क में DataFrame डेवलपर्स को डेटा के वितरित संग्रह पर एक संरचना लगाने की अनुमति देता है, जिससे उच्च-स्तरीय अमूर्तता की अनुमति मिलती है।
स्पार्क डेटासैट -
अपाचे स्पार्क में डेटासेट डेटाफ़्रेम एपीआई का एक विस्तार है जो टाइप-सेफ, ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग इंटरफ़ेस प्रदान करता है। डेटासेट भाव और डेटा फ़ील्ड को क्वेरी प्लानर के सामने लाकर स्पार्क के कैटेलिस्ट ऑप्टिमाइज़र का लाभ उठाता है।
सभी महान जवाब और प्रत्येक एपीआई का उपयोग करने से कुछ व्यापार बंद हो जाता है। डेटासैट को बहुत सी समस्या को हल करने के लिए सुपर एपीआई के रूप में बनाया गया है लेकिन कई बार आरडीडी अभी भी सबसे अच्छा काम करता है यदि आप अपने डेटा को समझते हैं और यदि प्रोसेसिंग एल्गोरिदम को सिंगल पास टू बिग डेटा में बहुत सारी चीजें करने के लिए अनुकूलित किया जाता है तो आरडीडी सबसे अच्छा विकल्प लगता है।
डेटासेट API का उपयोग करके एकत्रीकरण अभी भी मेमोरी का उपभोग करता है और समय के साथ बेहतर होगा।