التحويلات والإجراءات
حساب كسول
التحويلات والإجراءات درس مجاني في Scala for Backend Engineering & Functional Programming على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Scala for Backend Engineering & Functional Programming، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.
نوعان من العمليات
تنقسم عمليات Spark إلى تحويلات (تنشئ مجموعة بيانات جديدة وبطريقة كسولة) وإجراءات (تطلق الحساب وتعيد نتيجة أو تكتب مخرجات).
التقييم الكسول
التحويلات كسولة: فهي تسجل ما ينبغي فعله لكنها لا تنفّذ شيئًا. تنشئ Spark رسمًا بيانيًا موجّهًا لا دوريًا (DAG) للتحويلات، ولا تنفّذه إلا عند استدعاء إجراء.
map وfilter
تحوّل map كل عنصر، بينما تُبقي filter العناصر التي تطابق predicate. ويعيد كلاهما RDDs/Datasets جديدة ولا ينفّذ شيئًا بعد.
val nums = sc.parallelize(1 to 10)
val evens = nums.filter(_ % 2 == 0).map(_ * 10)
// nothing computed yetflatMap
تحوّل flatMap كل عنصر إلى صفر من المخرجات أو أكثر، ثم تبسّطها، وهو أسلوب شائع لتقسيم الأسطر إلى كلمات.
val lines = sc.parallelize(Seq("hello world", "spark rocks"))
val words = lines.flatMap(_.split(" "))الإجراءات الشائعة
تؤدي الإجراءات إلى تنفيذ العمليات:
collect— جلب جميع النتائج إلى برنامج التشغيلcount— حساب عدد العناصرfirst/take(n)— أخذ عينات من الصفوفreduce— دمج القيم في قيمة واحدة
val total = sc.parallelize(1 to 100).reduce(_ + _)
println(total) // 5050 — runs nowالتحويلات الضيقة مقابل الواسعة
لا تحتاج التحويلات الضيقة (map، filter) إلى نقل البيانات. أما التحويلات الواسعة (groupByKey، reduceByKey، join) فتؤدي إلى إعادة توزيع (shuffle) عبر الشبكة.
reduceByKey
في RDDs التي تحتوي على أزواج مفتاح-قيمة، تجمع reduceByKey القيم لكل مفتاح. وهي تدمج القيم محليًا قبل إعادة التوزيع، مما يجعلها أكثر كفاءة من groupByKey.
val pairs = sc.parallelize(Seq(("a", 1), ("b", 1), ("a", 1)))
val counts = pairs.reduceByKey(_ + _)
// (a, 2), (b, 1)التخزين المؤقت
إذا أُعيد استخدام مجموعة بيانات عبر إجراءات متعددة، فإن cache أو persist يحتفظ بها في الذاكرة حتى لا يُعاد حسابها في كل مرة.
val cached = sc.parallelize(1 to 1000).filter(_ % 3 == 0).cache()
println(cached.count())
println(cached.sum())تحويلات DataFrame
تحتوي DataFrames على تحويلات كسولة خاصة بها: select، where، withColumn، orderBy. وتؤدي إجراءات مثل show وcollect إلى تنفيذها.
import org.apache.spark.sql.functions._
val adults = df.where(col("age") >= 18)
.withColumn("adult", lit(true))
adults.show()مثال عدّ الكلمات الشهير
مهمة Spark التقليدية: تقسيم الأسطر، ثم تحويل كل كلمة إلى واحد، ثم الاختزال حسب المفتاح. لا ينفذ خط الأنابيب إلا الإجراء النهائي collect.
val text = sc.textFile("book.txt")
val counts = text.flatMap(_.split(" "))
.map(w => (w, 1))
.reduceByKey(_ + _)
counts.collect().foreach(println)النظير الكسول في Scala العادية
نظير مستقل في Scala: يؤجل العرض الكسول العمل حتى فرض تقييمه، محاكيًا الفصل في Spark بين التحويلات والإجراءات.
object Main {
def main(args: Array[String]): Unit = {
val pipeline = (1 to 10).view.filter(_ % 2 == 0).map(_ * 10) // lazy
val result = pipeline.toList // forces evaluation (action)
println(result)
}
}تحقق سريع
متى تنفذ Spark فعليًا سلسلة تحويلات map وfilter؟
مراجعة
لقد تعلمت نموذج تنفيذ Spark:
- التحويلات كسولة (
map،filter،flatMap،reduceByKey) - الإجراءات تؤدي إلى تنفيذ العمل (
collect،count،reduce) - العمليات الضيقة مقابل الواسعة (إعادة التوزيع)
- استخدام
cacheلإعادة استخدام النتائج
التالي: Spark SQL.
الأسئلة الشائعة
هل درس «التحويلات والإجراءات» مجاني؟
نعم — نص درس «التحويلات والإجراءات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Scala for Backend Engineering & Functional Programming، انتقل إلى CoddyKit PRO. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.
ماذا ستتعلم في «التحويلات والإجراءات»؟
حساب كسول تتمرن على Scala for Backend Engineering & Functional Programming مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Scala for Backend Engineering & Functional Programming؟
لا تُشترط خبرة سابقة. Scala for Backend Engineering & Functional Programming على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «التحويلات والإجراءات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Scala for Backend Engineering & Functional Programming هذا؟
نعم. كل درس في Scala for Backend Engineering & Functional Programming يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- RDDs وDataFrames
- التحويلات والإجراءات
- Spark SQL
- التجميعات