apache spark - الفرق بين DataFrame و Dataset و RDD في Spark




apache-spark spark-dataframe (10)

أول شيء هو تم تطوير SchemaRDD من SchemaRDD .

نعم .. التحويل بين Dataframe و RDD ممكن تمامًا.

فيما يلي بعض مقتطفات نموذج التعليمات البرمجية.

  • df.rdd هو RDD[Row]

فيما يلي بعض الخيارات لإنشاء dataframe.

  • 1) yourrddOffrow.toDF يحول إلى DataFrame .

  • 2) باستخدام createDataFrame سياق SQL

    val df = spark.createDataFrame(rddOfRow, schema)

حيث يمكن أن يكون المخطط من بعض الخيارات أدناه كما هو موضح في منشور SO اللطيف ..
من فئة الحالة سكالا وانعكاس سكالا api

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 واجهات برمجة تطبيقات Apache Spark ..

  1. واجهة برمجة تطبيقات RDD :

توجد واجهة برمجة تطبيقات RDD (مجموعة البيانات الموزعة المرنة) في Spark منذ الإصدار 1.0.

يوفر RDD API العديد من أساليب التحويل ، مثل 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

قدمت Spark 1.3 واجهة برمجة تطبيقات DataFrame جديدة كجزء من مبادرة Project Tungsten التي تسعى إلى تحسين الأداء وقابلية تطوير Spark. تقدم واجهة برمجة تطبيقات DataFrame مفهوم المخطط لوصف البيانات ، مما يسمح لـ Spark بإدارة المخطط وتمرير البيانات فقط بين العقد ، بطريقة أكثر فاعلية من استخدام تسلسل Java.

DataFrame واجهة برمجة تطبيقات DataFrame بشكل جذري عن واجهة برمجة تطبيقات RDD نظرًا لأنها واجهة برمجة التطبيقات لإنشاء خطة استعلام علائقية يمكن لمحسن Spark's Catalyst تنفيذها بعد ذلك. واجهة برمجة التطبيقات (API) طبيعية للمطورين الذين لديهم دراية بخطط الاستعلام عن المباني

مثال نمط SQL:

df.filter("age > 21");

القيود: نظرًا لأن الرمز يشير إلى سمات البيانات حسب الاسم ، فلا يمكن للمترجم التقاط أي أخطاء. إذا كانت أسماء السمات غير صحيحة ، فلن يتم اكتشاف الخطأ إلا في وقت التشغيل ، عند إنشاء خطة الاستعلام.

الجانب السلبي الآخر مع واجهة برمجة تطبيقات DataFrame هو أنها تتمحور بشكل كبير للغاية ، بينما تدعم جافا ، إلا أن الدعم محدود.

على سبيل المثال ، عند إنشاء DataFrame من RDD الحالي لكائنات Java ، لا يستطيع مُحسِّن Spark's Catalyst استنتاج المخطط ويفترض أن أي كائنات في DataFrame تطبق واجهة scala.Product . case class Scala تعمل خارج المربع لأنها تقوم بتطبيق هذه الواجهة.

  1. Dataset API

يهدف Dataset API ، الذي تم إصداره كمعاينة API في Spark 1.6 ، إلى توفير أفضل ما في العالمين ؛ أسلوب البرمجة المعتاد للكائنات الموجهة وسلامة وقت الترجمة لـ RDD API ولكن مع مزايا الأداء الخاصة بمحسِّن استعلام Catalyst. تستخدم مجموعات البيانات أيضًا نفس آلية التخزين الفعالة خارج كومة الذاكرة المؤقتة مثل DataFrame API.

عندما يتعلق الأمر بتسلسل البيانات ، فإن Dataset API لديه مفهوم الترميز الذي يترجم بين تمثيلات JVM (الكائنات) وتنسيق Spark الثنائي الداخلي. يحتوي Spark على ترميزات مدمجة متقدمة جدًا من حيث أنها تنشئ شفرة بايت للتفاعل مع البيانات خارج الكومة وتوفر وصولًا عند الطلب إلى سمات فردية دون الحاجة إلى إلغاء تسلسل كائن كامل. لا توفر Spark واجهة برمجة تطبيقات (API) لتطبيق الترميز المخصص ، ولكن تم التخطيط لإصدار مستقبلي.

بالإضافة إلى ذلك ، تم تصميم Dataset API للعمل بشكل جيد على قدم المساواة مع كل من Java و Scala. عند العمل مع كائنات Java ، من المهم أن تكون متوافقة تمامًا مع الحبة.

مثال على نمط SQL API Dataset :

dataset.filter(_.age < 21);

فرق التقييم. بين DataFrame و DataSet :

مزيد من القراءة ... مقالة databricks - قصة ثلاثة من Apache Spark APIs: RDDs مقابل DataFrames و Datasets

أنا فقط أتساءل ما هو الفرق بين RDD و DataFrame (Spark 2.0.0 DataFrame هو مجرد اسم مستعار للنوع Dataset[Row] ) في Apache Spark؟

يمكنك تحويل واحد إلى الآخر؟


الكل (RDD ، DataFrame و DataSet) في صورة واحدة.

اعتمادات الصورة

RDD

RDD هي مجموعة متسامحة مع الأخطاء من العناصر التي يمكن تشغيلها على التوازي.

DataFrame

DataFrame هي مجموعة بيانات منظمة في أعمدة مسماة. إنه مكافئ نظريًا لجدول في قاعدة بيانات علائقية أو إطار بيانات في R / Python ، لكن مع تحسينات أكثر ثراءً تحت الغطاء .

Dataset

Dataset هي مجموعة موزعة من البيانات. Dataset هي واجهة جديدة تمت إضافتها في Spark 1.6 والتي توفر فوائد RDDs (كتابة قوية ، والقدرة على استخدام وظائف lambda القوية) مع مزايا محرك التنفيذ الأمثل لـ Spark SQL .

ملحوظة:

غالبًا ما تشير مجموعة بيانات الصفوف ( Dataset[Row] ) في Scala / Java إلى DataFrames .

Nice comparison of all of them with a code snippet

source

س: هل يمكنك تحويل واحد إلى الآخر مثل RDD إلى DataFrame أو العكس؟

نعم ، كلاهما ممكن

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|
+------+----+----+

طرق أخرى: تحويل كائن RDD إلى Dataframe في Spark

2. DataFrame / DataSet إلى RDD مع طريقة .rdd()

val rowsRdd: RDD[Row] = df.rdd() // DataFrame to RDD

Dataframe هي RDD من كائنات Row ، يمثل كل منها سجلاً. تعرف Dataframe أيضًا المخطط (أي ، حقول البيانات) في صفوفها. في حين تبدو Dataframes وكأنها RDDs منتظمة ، فإنها تخزن البيانات داخليًا بطريقة أكثر كفاءة ، مع الاستفادة من مخططها. بالإضافة إلى ذلك ، فهي توفر عمليات جديدة غير متوفرة على RDDs ، مثل القدرة على تشغيل استعلامات SQL. يمكن إنشاء قواعد البيانات من مصادر البيانات الخارجية ، من نتائج الاستعلامات ، أو من RDDs العادية.

المرجع: Zaharia M. ، وآخرون. تعلم سبارك (أورايلي ، 2015)


ببساطة RDD هو المكون الأساسي ، ولكن DataFrame هو واجهة برمجة التطبيقات المقدمة في الشرارة 1.30.

RDD

مجموعة من أقسام البيانات تسمى RDD . يجب أن تتبع RDD بعض الخصائص مثل:

  • غير قابل للتغيير،
  • مستحمل للخطأ،
  • وزعت،
  • أكثر من.

هنا RDD هو منظم أو غير منظم.

DataFrame

DataFrame هي واجهة برمجة تطبيقات متوفرة في Scala و Java و Python و R. وهي تتيح معالجة أي نوع من البيانات المهيكلة وشبه المنظمة. لتعريف DataFrame ، مجموعة من البيانات الموزعة منظمة في أعمدة مسماة تسمى DataFrame . يمكنك بسهولة تحسين RDDs في DataFrame . يمكنك معالجة بيانات JSON وبيانات الباركيه وبيانات HiveQL في وقت واحد باستخدام DataFrame .

val sampleRDD = sqlContext.jsonFile("hdfs://localhost:9000/jsondata.json")

val sample_DF = sampleRDD.toDF()

تعتبر Sample_DF هنا DataFrame . sampleRDD هي (البيانات الأولية) تسمى RDD .


لأن DataFrame يتم 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") ، فأنت لا people("deptId") Int ، أو Long ، فأنت people("deptId") كائن Column تحتاج إلى العمل عليه. في اللغات التي بها أنظمة غنية مثل Scala ، ينتهي بك الأمر إلى فقدان كل أنواع السلامة مما يزيد من عدد أخطاء وقت التشغيل للأشياء التي يمكن اكتشافها في وقت الترجمة.

على العكس من ذلك ، تتم كتابة DataSet[T] . عندما تفعل:

val people: People = val people = sqlContext.read.parquet("...").as[People]

كنت في الواقع deptId كائنًا من People ، حيث يمثل deptId نوعًا لا يتجزأ فعليًا وليس نوعًا من الأعمدة ، وبالتالي تستفيد من نظام الكتابة.

اعتبارًا من Spark 2.0 ، سيتم توحيد DataFrame و DataSet APIs ، حيث سيكون DataFrame اسمًا مستعارًا لنوع DataSet[Row] .


معظم الإجابات صحيحة تريد فقط إضافة نقطة واحدة هنا

في Spark 2.0 ، سيتم توحيد واجهات برمجة التطبيقات (DataFrame + DataSet) معًا في واجهة برمجة تطبيقات واحدة.

"توحيد DataFrame و Dataset: في Scala و Java ، تم توحيد DataFrame و Dataset ، أي DataFrame هو مجرد اسم مستعار لنوع Dataset of Row. في Python و R ، نظرًا لغياب أمان النوع ، DataFrame هي واجهة البرمجة الرئيسية."

تتشابه مجموعات البيانات مع RDDs ، ولكن بدلاً من استخدام تسلسل Java أو Kryo ، يستخدمون Encoder متخصص لإجراء تسلسل الكائنات للمعالجة أو الإرسال عبر الشبكة.

يدعم Spark SQL طريقتين مختلفتين لتحويل RDDs الموجودة إلى مجموعات البيانات. تستخدم الطريقة الأولى الانعكاس لاستنتاج مخطط RDD الذي يحتوي على أنواع محددة من الكائنات. هذا النهج القائم على الانعكاس يؤدي إلى رمز أكثر إيجازًا ويعمل بشكل جيد عندما تعرف المخطط بالفعل أثناء كتابة تطبيق Spark.

الطريقة الثانية لإنشاء مجموعات البيانات هي من خلال واجهة برنامجية تسمح لك بإنشاء مخطط ثم تطبيقه على RDD موجود. على الرغم من أن هذه الطريقة أكثر مطوّلة ، إلا أنها تسمح لك بإنشاء مجموعات بيانات عندما لا تكون الأعمدة وأنواعها معروفة حتى وقت التشغيل.

هنا يمكنك العثور على RDD tof إطار المحادثة محادثة الإجابة

كيفية تحويل كائن rdd إلى dataframe في الشرارة


يعد DataFrame مكافئًا لجدول في RDBMS ويمكن أيضًا معالجته بطرق مشابهة للمجموعات الموزعة "الأصلية" في RDDs. على عكس RDDs ، تتبع Dataframes المخطط ودعم العمليات المختلفة التي تؤدي إلى تنفيذ أفضل. يمثل كل كائن DataFrame خطة منطقية ولكن بسبب طبيعتها "البطيئة" ، لا يحدث أي تنفيذ حتى يستدعي المستخدم "عملية إخراج" محددة.


يمكنك استخدام RDD مع Structured وغير منظم حيث يمكن Dataframe / Dataset فقط معالجة البيانات المهيكلة وشبه الهيكلية (لديها مخطط صحيح)


DataFrame هو RDD يحتوي على مخطط. يمكنك التفكير في الأمر كجدول قاعدة بيانات علائقية ، حيث أن كل عمود له اسم ونوع معروف. تأتي قوة DataFrames من حقيقة أنه عندما تقوم بإنشاء DataFrame من مجموعة بيانات منظمة (Json ، Parquet ..) ، فإن Spark تكون قادرة على استنتاج مخطط عن طريق تمرير بيانات كاملة (Json ، Parquet ..) يتم تحميلها. بعد ذلك ، عند حساب خطة التنفيذ ، يمكن لـ Spark استخدام المخطط والقيام بتحسينات حسابية أفضل بكثير. لاحظ أن DataFrame كان يسمى SchemaRDD قبل Spark v1.3.0


Spark RDD (resilient distributed dataset) :

RDD هو واجهة برمجة تطبيقات تجريد البيانات الأساسية ومتاح منذ الإصدار الأول من Spark (Spark 1.0). إنها واجهة برمجة تطبيقات ذات مستوى أدنى لمعالجة مجموعة البيانات الموزعة. تكشف واجهات برمجة تطبيقات RDD بعض الأساليب المفيدة للغاية والتي يمكن استخدامها للتحكم الدقيق للغاية في بنية البيانات الفعلية الأساسية. إنها مجموعة ثابتة (للقراءة فقط) من البيانات المقسمة الموزعة على أجهزة مختلفة. RDD يتيح الحساب في الذاكرة على مجموعات كبيرة لتسريع معالجة البيانات الكبيرة بطريقة تسامح مع الخطأ. لتمكين التسامح مع الخطأ ، يستخدم RDD DAG (الرسم البياني الحلقي المباشر) الذي يتكون من مجموعة من الرؤوس والحواف. تمثل القمم والحواف في DAG RDD والعملية الواجب تطبيقها على ذلك RDD على التوالي. التحولات المعرفة في RDD كسولة ولا يتم تنفيذها إلا عند استدعاء إجراء ما

Spark DataFrame :

قدمت سبارك 1.3 اثنين من واجهات برمجة التطبيقات الجديدة لتجريد البيانات - DataFrame و DataSet. تنظم واجهات برمجة التطبيقات DataFrame البيانات في أعمدة مسماة مثل جدول في قاعدة البيانات الترابطية. أنها تمكن المبرمجين من تحديد المخطط على مجموعة موزعة من البيانات. كل صف في DataFrame هو من نوع كائن الصف. مثل جدول SQL ، يجب أن يكون لكل عمود نفس عدد الصفوف في DataFrame. باختصار ، يتم تقييم DataFrame خطة كسول والذي يحدد العمليات التي يتعين القيام بها على جمع البيانات الموزعة. DataFrame هو أيضا مجموعة غير قابلة للتغيير.

Spark DataSet :

امتدادًا لواجهة برمجة تطبيقات DataFrame ، قدم Spark 1.3 أيضًا واجهات برمجة تطبيقات DataSet التي توفر واجهة برمجة مكتوبة بدقة وموجهة للكائنات في Spark. إنها مجموعة ثابتة وغير آمنة من البيانات الموزعة. مثل DataFrame ، تستخدم واجهات برمجة التطبيقات DataSet أيضًا محرك Catalyst لتمكين تحسين التنفيذ. DataSet هو امتداد لواجهة برمجة تطبيقات DataFrame.

Other Differences -





apache-spark-dataset