Iskra عبارة عن مكتبة مجمعة Scala 3 حول Apache Spark API والتي تسمح بكتابة رمز Spark بطريقة آمنة وخالية من النموذج النموذجي ولكنها لا تزال فعالة.
بدءًا من الإصدار 3.2.0، يتم تجميع Spark أيضًا لـ Scala 2.13، مما يفتح طريقة لاستخدام رمز Spark من Scala 3، حيث يمكن أن تعتمد مشاريع Scala 3 على عناصر Scala 2.13.
ومع ذلك، قد يواجه المرء مشاكل عند محاولة استدعاء طريقة تتطلب مثيلًا ضمنيًا لنوع Spark's Encoder
. يعتمد اشتقاق مثيلات Encoder
على وجود TypeTag
لنوع معين. ومع ذلك، لم يتم إنشاء TypeTag
s بواسطة مترجم Scala 3 بعد الآن (ولا توجد خطط لدعم ذلك) لذلك لا يمكن تصنيع مثيلات Encoder
تلقائيًا في معظم الحالات.
تحاول Iskra التغلب على هذه المشكلة باستخدام برامج التشفير الخاصة بها (غير المرتبطة بنوع Spark's Encoder
) التي تم إنشاؤها باستخدام واجهة برمجة تطبيقات البرمجة الوصفية الجديدة لـ Scala 3.
توفر Iskra أغلفة رفيعة (لكن مكتوبة بقوة) حول DataFrame
s، والتي تتتبع أنواع وأسماء الأعمدة في وقت الترجمة ولكنها تسمح لـ Catalyst بإجراء جميع التحسينات في وقت التشغيل.
تستخدم Iskra الأنواع الهيكلية بدلاً من فئات الحالات كنماذج بيانات، مما يمنحنا قدرًا كبيرًا من المرونة (لا داعي لتعريف فئة حالة جديدة بشكل صريح عند إضافة/إزالة/إعادة تسمية عمود!) ولكننا لا نزال نتلقى أخطاء في الترجمة عندما نحاول قم بالإشارة إلى عمود غير موجود أو لا يمكن استخدامه في سياق معين.
//> using lib " org.virtuslab::iskra:0.0.3 "
scala-cli repl --dep org.virtuslab::iskra:0.0.3
build.sbt
في مشروع sbt: libraryDependencies + = " org.virtuslab " %% " iskra " % " 0.0.3 "
تم تصميم Iskra باستخدام Scala 3.1.3 لذا فهو متوافق مع Scala 3.1.x والإصدارات الثانوية الأحدث (بدءًا من 3.2.0، ستحصل على إكمال التعليمات البرمجية لأسماء الأعمدة في REPL وMetals!). تعتمد Iskra بشكل انتقالي على Spark 3.2.0.
import org . virtuslab . iskra . api . *
given spark : SparkSession =
SparkSession
.builder()
.master( " local " )
.appName( " my-spark-app " )
.getOrCreate()
toTypedDF
على Seq
فئات الحالات، على سبيل المثال Seq ( Foo ( 1 , " abc " ), Foo ( 2 , " xyz " )).toTypedDF
typed
عليه باستخدام معلمة نوع تمثل فئة حالة، على سبيل المثال df.typed[ Foo ]
في حالة رغبتك في العودة إلى العالم غير الآمن لإطارات البيانات غير المكتوبة لسبب ما، ما عليك سوى الاتصال بـ .untyped
في إطار بيانات مكتوب.
تهدف هذه المكتبة إلى أن تشبه إلى أقصى حد واجهة برمجة التطبيقات الأصلية لـ Spark (على سبيل المثال، باستخدام نفس أسماء الطرق، وما إلى ذلك) حيثما أمكن ذلك، على الرغم من محاولة جعل الكود يشبه Scala العادي دون الحاجة إلى قالب معياري غير ضروري وإضافة بعض التحسينات النحوية الأخرى.
أهم الاختلافات:
$.foo.bar
بدلاً من $"foo.bar"
أو col("foo.bar")
. استخدم العلامات الخلفية عند الضرورة، على سبيل المثال $.`column with spaces`
..select(...)
أو .select{...}
يجب عليك إرجاع شيء ما عبارة عن عمود مسمى أو مجموعة من الأعمدة المسماة. نظرًا لكيفية عمل بناء جملة Scala، يمكنك الكتابة ببساطة .select($.x, $.y)
بدلاً من select(($.x, $.y))
. باستخدام الأقواس يمكنك حساب القيم المتوسطة مثل .select {
val sum = ($.x + $.y).as( " sum " )
($.x, $.y, sum)
}
foos.innerJoin(bars).on($.foos.barId === $.bars.id).select(...)
foos
و bars
تلقائيًا تم إنشاء هذا المشروع باستخدام scala-cli لذا استخدم الأوامر التقليدية مع .
كجذر مثل scala-cli compile .
أو scala-cli test .
.
للحصول على إصدار أحدث من قسم Usage
، انظر هنا