स्पार्क में डेटाफ्रेम, डेटासेट और आरडीडी के बीच अंतर


257

मैं बस सोच रहा हूँ एक के बीच अंतर क्या है RDDऔर DataFrame (स्पार्क 2.0.0 DataFrame के लिए एक मात्र प्रकार अन्य नाम है Dataset[Row]) अपाचे स्पार्क में?

क्या आप एक को दूसरे में बदल सकते हैं?

जवाबों:


232

A DataFrameको "DataFrame परिभाषा" के लिए एक Google खोज के साथ अच्छी तरह से परिभाषित किया गया है:

डेटा फ़्रेम एक तालिका, या दो-आयामी सरणी जैसी संरचना है, जिसमें प्रत्येक कॉलम में एक चर पर माप होता है, और प्रत्येक पंक्ति में एक मामला होता है।

तो, DataFrameइसके सारणीबद्ध प्रारूप के कारण अतिरिक्त मेटाडेटा है, जो स्पार्क को अंतिम रूप से क्वेरी पर कुछ अनुकूलन चलाने की अनुमति देता है।

एक RDDओर, दूसरी ओर, केवल एक R esilient D istributed D ataset है जो कि डेटा के एक ब्लैकबॉक्स से अधिक है जो कि इसके खिलाफ किए जा सकने वाले ऑपरेशन के रूप में अनुकूलित नहीं किया जा सकता है, उतने विवश नहीं हैं।

हालांकि, अगर आप एक के लिए एक DataFrame से जा सकते हैं RDDइसके माध्यम से rddविधि है, और आप एक से जा सकते हैं RDDएक करने के लिए DataFrameके माध्यम से (यदि RDD तालिका स्वरूप में है) toDFविधि

सामान्य तौर पर इसे DataFrameबिल्ट ऑप्टिमाइज़ेशन के कारण जहाँ संभव हो उपयोग करने की सलाह दी जाती है ।


6
उत्तर डेटासेट के बारे में स्पष्टीकरण प्रदान नहीं करता है। स्पार्क- द डेफिनिटिव गाइड के अनुसार, डेटासेट एक प्रकार की सुरक्षित संरचित एपी है। तो आप अपने स्कीमा का प्रकार पहले से प्रदान कर सकते हैं।
चिंतन पंड्या

3
धन्यवाद - मूल प्रश्न और (डेटासेट को शामिल नहीं किया गया) के बाद मूल शीर्षक और विवरण को अच्छी तरह से संपादित किया गया था
जस्टिन पीहनी

219

पहली बात DataFrameइससे विकसित हुई थी SchemaRDD

अपदस्थ विधि toSchemaRDD

हाँ .. के बीच रूपांतरण 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 अपाचे स्पार्क एपीआई हैं ..

यहां छवि विवरण दर्ज करें

  1. 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)
  1. DataFrame एपीआई

स्पार्क 1.3 ने DataFrameप्रोजेक्ट टंगस्टन पहल के हिस्से के रूप में एक नया एपीआई पेश किया जो स्पार्क के प्रदर्शन और स्केलेबिलिटी में सुधार करना चाहता है। DataFrameAPI का परिचय एक स्कीमा की अवधारणा डेटा का वर्णन, स्कीमा का प्रबंधन करने के लिए और केवल नोड्स के बीच डेटा पास, जावा क्रमबद्धता का उपयोग कर की तुलना में काफी अधिक कुशल तरीके से स्पार्क की इजाजत दी।

DataFrameएपीआई से बिल्कुल भिन्न है RDD, क्योंकि यह एक रिलेशनल क्वेरी योजना है कि स्पार्क का उत्प्रेरक अनुकूलक तो निष्पादित कर सकते हैं के निर्माण के लिए एक API है एपीआई। एपीआई उन डेवलपर्स के लिए स्वाभाविक है जो क्वेरी योजनाओं के निर्माण से परिचित हैं

उदाहरण एसक्यूएल शैली:

df.filter("age > 21");

सीमाएं: क्योंकि कोड नाम से डेटा विशेषताओं का उल्लेख कर रहा है, इसलिए कंपाइलर के लिए किसी भी त्रुटि को पकड़ना संभव नहीं है। यदि विशेषता नाम गलत हैं, तो त्रुटि केवल रनटाइम पर पता चलेगी, जब क्वेरी योजना बनाई जाती है।

DataFrameएपीआई के साथ एक और नकारात्मक पहलू यह है कि यह बहुत स्केला-केंद्रित है और जब यह जावा का समर्थन करता है, तो समर्थन सीमित है।

उदाहरण के लिए, DataFrameकिसी RDDजावा ऑब्जेक्ट से मौजूदा बनाने पर , स्पार्क के कैटलिस्ट ऑप्टिमाइज़र स्कीमा का अनुमान नहीं लगा सकते हैं और मान लेते हैं कि डेटाफ़्रेम में कोई भी ऑब्जेक्ट scala.Productइंटरफ़ेस को लागू करता है। स्काला case classबॉक्स का काम करता है क्योंकि वे इस इंटरफ़ेस को लागू करते हैं।

  1. Dataset एपीआई

Datasetएपीआई, स्पार्क 1.6 में एक API पूर्वावलोकन के रूप में जारी की है, दोनों दुनिया के सर्वश्रेष्ठ प्रदान करना है; परिचित वस्तु-उन्मुख प्रोग्रामिंग शैली और RDDएपीआई के संकलन-समय-प्रकार की सुरक्षा लेकिन उत्प्रेरक क्वेरी ऑप्टिमाइज़र के प्रदर्शन लाभ के साथ। डेटासेट भी DataFrameएपीआई के समान कुशल ऑफ-हीप स्टोरेज तंत्र का उपयोग करता है।

जब डेटा को क्रमबद्ध करने की बात आती है, तो Datasetएपीआई में एनकोडर की अवधारणा होती है जो जेवीएम अभ्यावेदन (ऑब्जेक्ट) और स्पार्क के आंतरिक बाइनरी प्रारूप के बीच अनुवाद करती है। स्पार्क में बिल्ट-इन एन्कोडर हैं जो बहुत उन्नत हैं जिसमें वे ऑफ-हाइप डेटा के साथ इंटरैक्ट करने के लिए बाइट कोड उत्पन्न करते हैं और एक पूरे ऑब्जेक्ट को डी-सीरियल किए बिना व्यक्तिगत विशेषताओं तक ऑन-डिमांड एक्सेस प्रदान करते हैं। स्पार्क अभी तक कस्टम एनकोडर को लागू करने के लिए एक एपीआई प्रदान नहीं करता है, लेकिन यह भविष्य के रिलीज के लिए योजनाबद्ध है।

इसके अतिरिक्त, Datasetएपीआई को जावा और स्काला दोनों के साथ समान रूप से अच्छी तरह से काम करने के लिए डिज़ाइन किया गया है। जावा ऑब्जेक्ट के साथ काम करते समय, यह महत्वपूर्ण है कि वे पूरी तरह से सेम-कंप्लेंट हैं।

उदाहरण DatasetAPI SQL शैली:

dataset.filter(_.age < 21);

मूल्यांकन अलग। DataFrameऔर के बीच DataSet: यहां छवि विवरण दर्ज करें

कैटालिस्ट स्तर का प्रवाह। । (स्पार्क शिखर सम्मेलन से डेटाफ़्रेम और डेटासेट प्रस्तुति का प्रदर्शन यहां छवि विवरण दर्ज करें

आगे पढें ... डेटाब्रिक्स लेख - ए टेल ऑफ़ थ्री अपाचे स्पार्क एपीआई: आरडीडी बनाम डेटाफ्रेम और डेटासेट


दृढ़ता से टाइप की गई संरचना डेटासेट क्या है? यह कैसे DataFrame से अलग है?
अरविंद कुमार

डेटासेट में किस तरह के विश्लेषण त्रुटियां शामिल हैं?
नीलेशकुमार एस

5
@ नीलेश-श्रीनिवासन: डेटाफ्रेम सिंटैक्स में उदाहरण लें, df.filter("age > 21");इसका मूल्यांकन केवल रन टाइम में किया जा सकता है। अपनी स्ट्रिंग के बाद से। डेटासैट के इनसेट, डेटासैट सेम कंप्लेंट हैं। इसलिए उम्र सेम संपत्ति है। यदि आपके बीन में उम्र की संपत्ति नहीं है, तो आपको जल्दी (यानी dataset.filter(_.age < 21);) संकलन समय में पता चल जाएगा । विश्लेषण त्रुटि को मूल्यांकन त्रुटियों के रूप में बदला जा सकता है।
राम गद्याराम

@ नीलेश श्रीनिवासन: अधिक जानकारी और विवरणों के लिए देखें अपाचे-स्पार्क-
आपी

पहली तस्वीर भ्रामक है। अजगर पायथन में उपलब्ध नहीं हैं
येइकल

135

अपाचे स्पार्क तीन प्रकार के एपीआई प्रदान करता है

  1. RDD
  2. डेटा ढांचा
  3. डेटासेट

RDD, डेटाफ्रेम और डेटासेट एपीआई की तुलना करना

यहाँ RDD, डेटाफ्रेम और डेटासेट के बीच API की तुलना की गई है।

RDD

मुख्य अमूर्त स्पार्क प्रदान करता है एक लचीली वितरित डेटासेट (RDD) है, जो कि क्लस्टर के नोड्स में विभाजित किए गए तत्वों का एक संग्रह है जिसे समानांतर में संचालित किया जा सकता है।

RDD विशेषताएं: -

  • वितरित संग्रह:
    RDD MapReduce के संचालन का उपयोग करता है, जो एक क्लस्टर पर समानांतर, वितरित एल्गोरिदम के साथ बड़े डेटासेट को संसाधित करने और उत्पन्न करने के लिए व्यापक रूप से अपनाया जाता है। यह उपयोगकर्ताओं को काम वितरण और गलती सहिष्णुता के बारे में चिंता किए बिना, उच्च-स्तरीय ऑपरेटरों के एक सेट का उपयोग करके, समानांतर संगणना लिखने की अनुमति देता है।

  • अपरिवर्तनीय: RDD रिकॉर्ड्स के एक संग्रह से बना होता है जो कि विभाजन होता है। एक विभाजन RDD में समानांतरवाद की एक बुनियादी इकाई है, और प्रत्येक विभाजन डेटा का एक तार्किक विभाजन है जो अपरिवर्तनीय है और मौजूदा विभाजनों पर कुछ परिवर्तनों के माध्यम से बनाया गया है। Immutability संगणना में स्थिरता प्राप्त करने में मदद करता है।

  • दोष सहिष्णु: अगर हम RDD के कुछ विभाजन को खो देते हैं, तो हम एक ही गणना को प्राप्त करने के लिए वंश में उस विभाजन पर हुए परिवर्तन को फिर से दोहरा सकते हैं, बल्कि कई नोड्स में डेटा प्रतिकृति कर सकते हैं। यह विशेषता RDD का सबसे बड़ा लाभ है क्योंकि यह बचाता है डेटा प्रबंधन और प्रतिकृति में प्रयासों और इस प्रकार का एक बहुत तेजी से संगणना प्राप्त होता है।

  • आलसी मूल्यांकन: स्पार्क में सभी परिवर्तन आलसी हैं, इसमें वे तुरंत अपने परिणामों की गणना नहीं करते हैं। इसके बजाय, वे कुछ आधार डाटासेट के लिए लागू परिवर्तनों याद है। परिवर्तनों की गणना केवल तब की जाती है जब किसी क्रिया को ड्राइवर प्रोग्राम में वापस करने की आवश्यकता होती है।

  • कार्यात्मक रूपांतरण: आरडीडी दो प्रकार के संचालन का समर्थन करते हैं: परिवर्तन, जो एक मौजूदा से एक नया डेटासेट बनाते हैं, और क्रियाएं, जो डेटासेट पर एक संगणना चलाने के बाद ड्राइवर प्रोग्राम के लिए एक मान लौटाती हैं।

  • डेटा प्रोसेसिंग प्रारूप:
    यह आसानी से और कुशलता से डेटा को प्रोसेस कर सकता है जो संरचित के साथ-साथ अनस्ट्रक्चर्ड डेटा भी है।

  • प्रोग्रामिंग भाषा समर्थित:
    RDD एपीआई जावा, स्काला, पायथन और आर में उपलब्ध है।

RDD सीमाएँ: -

  • इनबिल्ट ऑप्टिमाइज़ेशन इंजन नहीं: संरचित डेटा के साथ काम करते समय, RDD उत्प्रेरक एडवांटेज और टंगस्टन निष्पादन इंजन सहित स्पार्क के उन्नत ऑप्टिमाइज़र का लाभ नहीं ले सकता है। डेवलपर्स को अपनी विशेषताओं के आधार पर प्रत्येक RDD का अनुकूलन करने की आवश्यकता होती है।

  • संरचित डेटा को संभालना: डेटाफ्रेम और डेटासेट के विपरीत, RDD इनग्रेस्ड डेटा के स्कीमा का अनुमान नहीं लगाते हैं और उपयोगकर्ता को इसे निर्दिष्ट करने की आवश्यकता होती है।

Dataframes

स्पार्क ने स्पार्क 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

यह विशेष रूप से चुनौतीपूर्ण है जब आप कई परिवर्तन और एकत्रीकरण चरणों के साथ काम कर रहे हैं।

  • डोमेन ऑब्जेक्ट (खोई हुई डोमेन ऑब्जेक्ट) पर काम नहीं कर सकता: एक बार जब आप एक डोमेन ऑब्जेक्ट को डेटाफ्रेम में बदल देते हैं, तो आप इसे इससे पुन: उत्पन्न नहीं कर सकते। निम्नलिखित उदाहरण में, एक बार जब हमने personRDD से personDF बनाया है, तो हम व्यक्ति वर्ग (RDD [व्यक्ति]) के मूल RDD को पुनर्प्राप्त नहीं करेंगे।

उदाहरण:

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]
  • इंटरऑपरेबल: डेटासेट आपको बॉयलरप्लेट कोड के बिना अपने मौजूदा आरडीडी और डेटाफ्रेम को डेटासेट में आसानी से परिवर्तित करने की अनुमति देता है।

डेटासेट API सीमा: -

  • स्ट्रिंग के लिए टाइप कास्टिंग की आवश्यकता होती है: डेटासेट से डेटा को छोड़ना वर्तमान में हमें स्ट्रिंग के रूप में कक्षा में फ़ील्ड निर्दिष्ट करने की आवश्यकता है। एक बार जब हम डेटा को क्वेर कर देते हैं, तो हम कॉलम को आवश्यक डेटा टाइप करने के लिए मजबूर हो जाते हैं। दूसरी ओर, अगर हम डेटासेट पर मैप ऑपरेशन का उपयोग करते हैं, तो यह उत्प्रेरक ऑप्टिमाइज़र का उपयोग नहीं करेगा।

उदाहरण:

ds.select(col("name").as[String], $"age".as[Int]).collect()

पायथन और आर के लिए कोई समर्थन नहीं: जारी 1.6 के रूप में, डेटासेट केवल स्काला और जावा का समर्थन करता है। स्पार्क 2.0 में पायथन सपोर्ट पेश किया जाएगा।

डेटासेट एपीआई मौजूदा आरडीडी और डेटाफ़्रेम एपीआई पर बेहतर प्रकार की सुरक्षा और कार्यात्मक प्रोग्रामिंग के साथ कई फायदे लाता है। एपीआई में टाइप कास्टिंग आवश्यकताओं की चुनौती, आप अभी भी आवश्यक प्रकार की सुरक्षा नहीं करेंगे और अपने कोड को भंगुर बना देंगे।


2
से spark.apache.org/docs/latest/... , स्काला एपीआई में, DataFrame बस डेटासेट [पंक्ति] का एक प्रकार उर्फ है।
डीन चेन

इसलिए यह कहना ठीक है कि डेटासेट के साथ, हम टाइप-सेफ्टी हासिल करते हैं और ऑप्टिमाइज़र खो देते हैं?
खोआ

@BlueSky आप प्रकार-सुरक्षा हासिल करते हैं और अभी भी
आशावादी हैं

@AmitDubey यह सच नहीं है। DatasetLINQ नहीं है और लैम्ब्डा एक्सप्रेशन को एक्सप्रेशन ट्री के रूप में व्याख्यायित नहीं किया जा सकता है। इसलिए, ब्लैक बॉक्स हैं, और आप सभी (यदि सभी नहीं) ऑप्टिमाइज़र लाभ के बहुत ढीले हैं। संभावित डाउनसाइड्स का बस एक छोटा सा उप-समूह: स्पार्क 2.0 डेटासेट बनाम डाटाफ्रेम । इसके अलावा, बस कुछ दोहराने के लिए मैंने कई बार कहा - सामान्य रूप से एंड-टू-एंड प्रकार की जाँच Datasetएपीआई के साथ संभव नहीं है । जॉइन केवल सबसे प्रमुख उदाहरण हैं।
शून्य 323

52

सभी (RDD, DataFrame और DataSet) एक चित्र में।

RDD बनाम डाटाफ्रेम बनाम डाटासेट

छवि क्रेडिट

RDD

RDD उन तत्वों का दोष-सहिष्णु संग्रह है जिन्हें समानांतर में संचालित किया जा सकता है।

DataFrame

DataFrameएक डेटासेट नामांकित कॉलम में व्यवस्थित है। यह एक संबंधपरक डेटाबेस या आर / पायथन में एक डेटा फ्रेम की मेज के बराबर है, लेकिन हुड के तहत समृद्ध अनुकूलन के साथ

Dataset

Datasetडेटा का एक वितरित संग्रह है। डेटासेट स्पार्क 1.6 में जोड़ा गया एक नया इंटरफ़ेस है जो स्पार्क एसक्यूएल के अनुकूलित निष्पादन इंजन के लाभों के साथ आरडीडी (मजबूत टाइपिंग, शक्तिशाली लैम्ब्डा कार्यों का उपयोग करने की क्षमता) के लाभ प्रदान करता है


ध्यान दें:

Dataset[Row]स्काला / जावा में पंक्तियों के डेटासेट ( ) अक्सर डेटाफ़्रेम के रूप में संदर्भित होंगे


Nice comparison of all of them with a code snippet.

कोड के साथ RDD बनाम DataFrame बनाम DataSet

स्रोत


प्रश्न: क्या आप एक को 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

27

क्योंकि 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]


5
स्पार्क 2.0 के लिए सटीक होना Dataframe केवल एक उपनाम हैDataset[Row]
शून्य 323

1
@ zero323 हां, वास्तव में, लेकिन यह अभी भी कमजोर रूप से टाइप किया गया है, यह वही है जो मैं व्यक्त करने की कोशिश कर रहा था।
युवल इट्ज़चकोव

हाँ, लेकिन यह एक कंटेनर की तुलना में संग्रहीत मूल्यों का अधिक मामला है। 1.6 में भी ये दोनों तकनीकी रूप से समान थे और अलग-अलग रखने का मुख्य कारण DataFrameएपीआई बदलावों को तोड़ने से बचना था। वैसे भी, बस इसे इंगित करना चाहता था। मेरे लिए संपादन और उत्थान के लिए धन्यवाद।
शून्य 323

25

बस RDDकोर घटक है, लेकिन DataFrameएक एपीआई स्पार्क 1.30 में शुरू किया गया है।

RDD

डेटा विभाजन का संग्रह RDD। ये RDDकुछ गुणों का पालन करना चाहिए:

  • अपरिवर्तनीय,
  • सहिष्णु गलती,
  • वितरित,
  • अधिक।

यहाँ RDDया तो संरचित या असंरचित है।

डेटा ढांचा

DataFrameScala, 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()

यहाँ नमूना_डीएफ पर विचार करें DataFramesampleRDD(कच्चे डेटा) कहा जाता है RDD


12

अधिकांश उत्तर सही हैं केवल एक बिंदु को यहां जोड़ना चाहते हैं

स्पार्क 2.0 में दो API (DataFrame + DataSet) को एक साथ एक एपीआई में एकीकृत किया जाएगा।

"डेटाफ़्रेम और डेटासेट को एकीकृत करना: स्काला और जावा में, डेटाफ़्रेम और डेटासेट को एकीकृत किया गया है, अर्थात डेटाफ़्रेम, डेटा डेट के लिए रो का केवल एक प्रकार का उपनाम है। पायथन और आर में, टाइप सुरक्षा की कमी को देखते हुए, डेटाफ़्रेम मुख्य प्रोग्रामिंग इंटरफ़ेस है।"

डेटासेट आरडीडी के समान हैं, हालांकि, जावा सीरियललाइज़ेशन या क्रियो का उपयोग करने के बजाय वे नेटवर्क पर प्रसंस्करण या संचारित करने के लिए वस्तुओं को अनुक्रमित करने के लिए एक विशेष एनकोडर का उपयोग करते हैं।

स्पार्क एसक्यूएल मौजूदा आरडीडी को डेटासेट में बदलने के लिए दो अलग-अलग तरीकों का समर्थन करता है। पहली विधि एक RDD के स्कीमा को खोजने के लिए प्रतिबिंब का उपयोग करती है जिसमें विशिष्ट प्रकार की वस्तुएं होती हैं। यह प्रतिबिंब आधारित दृष्टिकोण अधिक संक्षिप्त कोड की ओर जाता है और अच्छी तरह से काम करता है जब आप अपने स्पार्क एप्लिकेशन को लिखते समय स्कीमा को जानते हैं।

डेटासेट बनाने के लिए दूसरी विधि एक प्रोग्रामेटिक इंटरफ़ेस के माध्यम से है जो आपको एक स्कीमा बनाने की अनुमति देती है और फिर इसे एक मौजूदा आरडीडी पर लागू करती है। जबकि यह विधि अधिक क्रिया है, यह आपको डेटासैट के निर्माण की अनुमति देता है जब कॉलम और उनके प्रकार रनटाइम तक ज्ञात नहीं होते हैं।

यहां आप RDD टोफ़ डेटा फ़्रेम वार्तालाप उत्तर पा सकते हैं

चिंगारी में rdd वस्तु को डेटाफ्रेम में कैसे बदलें


8

एक DataFrame RDBMS में एक तालिका के बराबर है और इसे RDD में "मूल" वितरित संग्रह के समान तरीकों से भी हेरफेर किया जा सकता है। आरडीडी के विपरीत, डेटाफ्रेम स्कीमा का ट्रैक रखते हैं और विभिन्न रिलेशनल ऑपरेशंस का समर्थन करते हैं जो अधिक अनुकूलित निष्पादन का नेतृत्व करते हैं। प्रत्येक DataFrame ऑब्जेक्ट एक तार्किक योजना का प्रतिनिधित्व करता है, लेकिन उनके "आलसी" प्रकृति के कारण कोई निष्पादन तब तक नहीं होता है जब तक कि उपयोगकर्ता एक विशिष्ट "आउटपुट ऑपरेशन" को कॉल नहीं करता है।


2
आरडीडी वैसे भी आलसी होते हैं।
कोन साइक

6

उपयोग के दृष्टिकोण से कुछ अंतर्दृष्टि, RDD बनाम डाटाफ्रेम:

  1. आरडीडी अद्भुत हैं! के रूप में वे हमें लगभग किसी भी तरह के डेटा से निपटने के लिए सभी लचीलापन देते हैं; असंरचित, अर्ध संरचित और संरचित डेटा। के रूप में, बहुत बार डेटा एक DataFrame, (यहां तक ​​कि JSON) में फिट होने के लिए तैयार नहीं है, RDDs का उपयोग डेटा पर प्रीप्रोसेसिंग करने के लिए किया जा सकता है ताकि यह डेटाफ़्रेम में फिट हो सके। RDD स्पार्क में कोर डेटा एब्स्ट्रैक्शन हैं।
  2. RDF पर सभी परिवर्तन संभव नहीं हैं DataFrames पर संभव है, उदाहरण घटाना () RDD बनाम छोड़कर () DataFrame के लिए है।
  3. चूंकि DataFrames एक रिलेशनल टेबल की तरह हैं, वे सेट / रिलेशनल सिद्धांत परिवर्तनों का उपयोग करते समय सख्त नियमों का पालन करते हैं, उदाहरण के लिए यदि आप दो डेटाफ्रेम को यूनियन करना चाहते थे, तो आवश्यकता यह है कि दोनों dfs में समान संख्या में कॉलम और संबंधित कॉलम डेटाैटिप हैं। कॉलम के नाम अलग हो सकते हैं। ये नियम RDDs पर लागू नहीं होते हैं। यहाँ एक अच्छा ट्यूटोरियल हैइन तथ्यों की व्याख्या करने ।
  4. डेटाफ्रैम का उपयोग करते समय प्रदर्शन लाभ होता है क्योंकि अन्य पहले ही गहराई से बता चुके हैं।
  5. डेटाफ्रेम का उपयोग करते हुए आपको आरडीडी के साथ प्रोग्रामिंग करते समय मनमाने कार्य को पारित करने की आवश्यकता नहीं होती है।
  6. स्पार्कफ़्लो इको-सिस्टम के स्पार्कक्यूज़ क्षेत्र में पड़े रहने के लिए आपको डेटाफ्रेम प्रोग्राम करने के लिए SQLContext / HiveContext की आवश्यकता होती है, लेकिन RDD के लिए आपको केवल स्पार्ककेंटेक्स्ट / JavaSparkContext की आवश्यकता होती है जो स्पार्क कोर लाइब्रेरीज़ में निहित होती हैं।
  7. आप RDD से df बना सकते हैं यदि आप इसके लिए स्कीमा को परिभाषित कर सकते हैं।
  8. आप rf को df और rdd को df में भी बदल सकते हैं।

मुझे उम्मीद है यह मदद करेगा!


5

एक डेटाफ़्रेम रो वस्तुओं का एक RDD है, प्रत्येक एक रिकॉर्ड का प्रतिनिधित्व करता है। एक डेटाफ़्रेम भी अपनी पंक्तियों के स्कीमा (यानी, डेटा फ़ील्ड) को जानता है। जबकि डेटाफ्रेम नियमित आरडीडी की तरह दिखते हैं, आंतरिक रूप से वे डेटा को अधिक कुशल तरीके से संग्रहीत करते हैं, अपने स्कीमा का लाभ उठाते हैं। इसके अलावा, वे RDDs पर उपलब्ध नए संचालन प्रदान नहीं करते हैं, जैसे कि SQL क्वेरी को चलाने की क्षमता। डेटाफ्रेम बाहरी डेटा स्रोतों से, प्रश्नों के परिणामों से या नियमित RDDs से बनाया जा सकता है।

संदर्भ: ज़हरिया एम।, एट अल। लर्निंग स्पार्क (ओ'रेली, 2015)


1

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 -

यहां छवि विवरण दर्ज करें


0

एक DataFrame एक RDD है जिसमें एक स्कीमा है। आप इसे एक रिलेशनल डेटाबेस टेबल के रूप में सोच सकते हैं, जिसमें प्रत्येक कॉलम में एक नाम और एक ज्ञात प्रकार होता है। DataFrames की शक्ति इस तथ्य से आती है कि, जब आप संरचित डेटासेट (Json, Parquet ..) से DataFrame बनाते हैं, तो स्पार्क संपूर्ण (Json, Parat ..) डेटासेट पर एक पास बनाकर एक स्कीमा को खोजने में सक्षम होता है। लोड किया जा रहा है। फिर, निष्पादन योजना की गणना करते समय, स्पार्क, स्कीमा का उपयोग कर सकते हैं और बेहतर संगणना अनुकूलन कर सकते हैं। ध्यान दें कि स्पार्क v1.3.0 से पहले डेटाफ्रैम को स्कीमाआरडीडी कहा जाता था


0

Apache Spark - RDD, DataFrame, और DataSet

स्पार्क आरडीडी -

एक RDD का मतलब है रिसिलिएंट डिस्ट्रीब्यूटेड डेटासेट्स। यह केवल रिकॉर्ड का विभाजन संग्रह है। RDD स्पार्क की मूलभूत डेटा संरचना है। यह एक प्रोग्रामर को बड़े-बड़े समूहों में इन-मेमोरी कम्प्यूटेशन को फॉल्ट-टॉलरेंट तरीके से करने की अनुमति देता है। इस प्रकार, कार्य को गति दें।

स्पार्क डेटाफ़्रेम -

RDD के विपरीत, नामित स्तंभों में डेटा का आयोजन किया जाता है। उदाहरण के लिए एक संबंधपरक डेटाबेस में एक तालिका। यह डेटा का एक अपरिवर्तित वितरित संग्रह है। स्पार्क में DataFrame डेवलपर्स को डेटा के वितरित संग्रह पर एक संरचना लगाने की अनुमति देता है, जिससे उच्च-स्तरीय अमूर्तता की अनुमति मिलती है।

स्पार्क डेटासैट -

अपाचे स्पार्क में डेटासेट डेटाफ़्रेम एपीआई का एक विस्तार है जो टाइप-सेफ, ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग इंटरफ़ेस प्रदान करता है। डेटासेट भाव और डेटा फ़ील्ड को क्वेरी प्लानर के सामने लाकर स्पार्क के कैटेलिस्ट ऑप्टिमाइज़र का लाभ उठाता है।


-1

आप RDD का स्ट्रक्चर्ड और अनस्ट्रक्चर्ड के साथ उपयोग कर सकते हैं जहाँ Dataframe / डेटासेट केवल संरचित और सेमी स्ट्रक्चर्ड डेटा को प्रोसेस कर सकता है (यह उचित स्कीमा है)


-2

सभी महान जवाब और प्रत्येक एपीआई का उपयोग करने से कुछ व्यापार बंद हो जाता है। डेटासैट को बहुत सी समस्या को हल करने के लिए सुपर एपीआई के रूप में बनाया गया है लेकिन कई बार आरडीडी अभी भी सबसे अच्छा काम करता है यदि आप अपने डेटा को समझते हैं और यदि प्रोसेसिंग एल्गोरिदम को सिंगल पास टू बिग डेटा में बहुत सारी चीजें करने के लिए अनुकूलित किया जाता है तो आरडीडी सबसे अच्छा विकल्प लगता है।

डेटासेट API का उपयोग करके एकत्रीकरण अभी भी मेमोरी का उपभोग करता है और समय के साथ बेहतर होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.