استخدام Spark للعمل مع ملفات البيانات

مكتمل

تتمثل إحدى فوائد استخدام Spark في أنه يمكنك كتابة التعليمات البرمجية وتشغيلها بلغات برمجة مختلفة، مما يتيح لك استخدام مهارات البرمجة التي لديك بالفعل واستخدام اللغة الأنسب لمهمة معينة. اللغة الافتراضية في دفتر ملاحظات Azure Databricks Spark الجديد هي PySpark - وهي نسخة محسّنة من Spark مع Python، والتي يستخدمها علماء البيانات والمحللون بشكل شائع بسبب دعمها القوي لمعالجة البيانات والتصور. بالإضافة إلى ذلك، يمكنك استخدام لغات مثل Scala (لغة مشتقة من Java يمكن استخدامها بشكل تفاعلي) و SQL (متغير من لغة SQL شائعة الاستخدام المضمنة في مكتبة Spark SQL للعمل مع بنيات البيانات الارتباطية). يمكن لمهندسي البرامج أيضًا إنشاء حلول مجمعة تعمل على Spark باستخدام أطر عمل مثل Java.

استكشاف البيانات باستخدام إطارات البيانات

يستخدم Spark في الأصل بنية بيانات تسمى مجموعة بيانات موزعة مرنة (RDD)؛ ولكن بينما يمكنك كتابة التعليمات البرمجية التي تعمل مباشرة مع مجموعات البيانات الموزعة المرنة، فإن بنية البيانات الأكثر استخداماً للعمل مع البيانات المنظمة في Spark هي إطار البيانات، الذي يتم توفيره كجزء من مكتبة Spark SQL. تتشابه إطارات البيانات في Spark مع تلك الموجودة في مكتبة Pandas Python في كل مكان، ولكنها محسنة للعمل في بيئة المعالجة الموزعة في Spark.

إشعار

بالإضافة إلى واجهة برمجة تطبيقات Dataframe، يوفر Spark SQL واجهة برمجة تطبيقات مجموعة بيانات مكتوبة بقوة ومدعمة في Java وSca. سنركز على واجهة برمجة تطبيقات إطار البيانات في هذه الوحدة.

تحميل البيانات في إطار البيانات

دعونا نستكشف مثالاً افتراضياً لمعرفة كيف يمكنك استخدام إطار بيانات للعمل مع البيانات. لنفترض أن لديك البيانات التالية في ملف نصي محدد بفواصل اسمه products.csv في مجلد data في تخزين نظام ملفات Databricks (DBFS):

ProductID,ProductName,Category,ListPrice
771,"Mountain-100 Silver, 38",Mountain Bikes,3399.9900
772,"Mountain-100 Silver, 42",Mountain Bikes,3399.9900
773,"Mountain-100 Silver, 44",Mountain Bikes,3399.9900
...

في دفتر ملاحظات Spark، يمكنك استخدام التعليمات البرمجية PySpark التالية لتحميل البيانات في إطار بيانات وعرض أول 10 صفوف:

%pyspark
df = spark.read.load('/data/products.csv',
    format='csv',
    header=True
)
display(df.limit(10))

%pysparkيسمى السطر في البداية سحراً، ويخبر Spark أن اللغة المستخدمة في هذه الخلية هي PySpark. فيما يلي التعليمة البرمجية المكافئة لـ Scala لمثال بيانات المنتجات:

%spark
val df = spark.read.format("csv").option("header", "true").load("/data/products.csv")
display(df.limit(10))

يتم استخدام السحر %spark لتحديد Scala.

تلميح

يمكنك أيضاً تحديد اللغة التي تريد استخدامها لكل خلية في واجهة دفتر الملاحظات.

سيؤدي كلا المثالين الموضحين سابقاً إلى إخراج مثل هذا:

معرّف المنتج ProductName الفئة ListPrice
771 Mountain-100 Silver, 38 Mountain Bikes 3399.9900
772 Mountain-100 Silver, 42 Mountain Bikes 3399.9900
773 Mountain-100 Silver, 44 Mountain Bikes 3399.9900
... ... ... ...

تحديد مخطط إطار بيانات

في المثال السابق، احتوى الصف الأول من ملف CSV على أسماء الأعمدة، وتمكن Spark من استنتاج نوع بيانات كل عمود من البيانات التي يحتوي عليها. يمكنك أيضاً تحديد مخطط صريح للبيانات، وهو أمر مفيد عندما لا يتم تضمين أسماء الأعمدة في ملف البيانات، مثل مثال CSV هذا:

771,"Mountain-100 Silver, 38",Mountain Bikes,3399.9900
772,"Mountain-100 Silver, 42",Mountain Bikes,3399.9900
773,"Mountain-100 Silver, 44",Mountain Bikes,3399.9900
...

يوضح مثال PySpark التالي كيفية تحديد مخطط لإطار البيانات المراد تحميله من ملف يسمى product-data.csv بهذا التنسيق:

from pyspark.sql.types import *
from pyspark.sql.functions import *

productSchema = StructType([
    StructField("ProductID", IntegerType()),
    StructField("ProductName", StringType()),
    StructField("Category", StringType()),
    StructField("ListPrice", FloatType())
    ])

df = spark.read.load('/data/product-data.csv',
    format='csv',
    schema=productSchema,
    header=False)
display(df.limit(10))

وستكون النتائج مرة أخرى مشابهة لما يلي:

معرّف المنتج ProductName الفئة ListPrice
771 Mountain-100 Silver, 38 Mountain Bikes 3399.9900
772 Mountain-100 Silver, 42 Mountain Bikes 3399.9900
773 Mountain-100 Silver, 44 Mountain Bikes 3399.9900
... ... ... ...

تصفية إطارات البيانات وتجميعها

يمكنك استخدام أساليب فئة Dataframe لتصفية البيانات التي تحتوي عليها وفرزها وتجميعها ومعالجتها بطريقة أخرى. على سبيل المثال، يستخدم مثال التعليمات البرمجية التالي أسلوب التحديد لاسترداد عمودي ProductName و ListPrice من إطار بيانات df الذي يحتوي على بيانات المنتج في المثال السابق:

pricelist_df = df.select("ProductID", "ListPrice")

ستبدو النتائج من مثال التعليمات البرمجية هذا كما يلي:

معرّف المنتج ListPrice
771 3399.9900
772 3399.9900
773 3399.9900
... ...

بشكل مشترك مع معظم أساليب معالجة البيانات، حدد إرجاع كائن إطار بيانات جديد.

تلميح

يعد تحديد مجموعة فرعية من الأعمدة من إطار البيانات عملية شائعة، والتي يمكن تحقيقها أيضا باستخدام بناء الجملة الأقصر التالي:

pricelist_df = df["ProductID", "ListPrice"]

يمكنك "ربط" الأساليب معا لتنفيذ سلسلة من المعالجات التي تؤدي إلى تحويل إطار البيانات. على سبيل المثال، يقوم مثال التعليمات البرمجية هذا بسلاسل التحديد و مكان إنشاء إطار بيانات جديد يحتوي على عمودي ProductName و ListPrice للمنتجات ذات فئة Mountain Bikes أو Road Bikes:

bikes_df = df.select("ProductName", "ListPrice").where((df["Category"]=="Mountain Bikes") | (df["Category"]=="Road Bikes"))
display(bikes_df)

ستبدو النتائج من مثال التعليمات البرمجية هذا كما يلي:

ProductName ListPrice
Mountain-100 Silver, 38 3399.9900
Road-750 Black, 52 539.9900
... ...

لجمع البيانات وتجميعها، يمكنك استخدام أسلوب groupBy والدالات التجميعية. على سبيل المثال، تحسب التعليمات البرمجية PySpark التالية عدد المنتجات لكل فئة:

counts_df = df.select("ProductID", "Category").groupBy("Category").count()
display(counts_df)

ستبدو النتائج من مثال التعليمات البرمجية هذا كما يلي:

الفئة عدد
سماعة الرأس 3
العجلات 14
Mountain Bikes 32
... ...

استخدام تعبيرات SQL في Spark

تعد واجهة برمجة تطبيقات Dataframe جزءاً من مكتبة Spark المسماة Spark SQL، والتي تمكن محللي البيانات من استخدام تعبيرات SQL للاستعلام عن البيانات ومعالجتها.

إنشاء كائنات قاعدة البيانات في كتالوج Spark

كتالوج Spark هو مخزن بيانات تعريفي لكائنات البيانات الارتباطية مثل طرق العرض والجداول. يمكن لوقت تشغيل Spark استخدام الكتالوج لدمج التعليمات البرمجية المكتوبة بأي لغة مدعومة من Spark بسلاسة مع تعبيرات SQL التي قد تكون أكثر طبيعية لبعض محللي البيانات أو المطورين.

تتمثل إحدى أبسط الطرق لتوفير البيانات في إطار بيانات للاستعلام في كتالوج Spark في إنشاء طريقة عرض مؤقتة، كما هو موضح في مثال التعليمات البرمجية التالي:

df.createOrReplaceTempView("products")

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

إشعار

لن نستكشف جداول كتالوج Spark بعمق في هذه الوحدة، ولكن من المفيد أخذ الوقت لتمييز بعض النقاط الرئيسية:

  • يمكنك إنشاء جدول فارغ باستخدام spark.catalog.createTable الأسلوب. الجداول هي بنيات بيانات التعريف التي تخزن بياناتها الأساسية في موقع التخزين المقترن بالكتالوج. يؤدي حذف جدول أيضاً إلى حذف بياناته الأساسية.
  • يمكنك حفظ إطار بيانات كجدول باستخدام saveAsTable أسلوبه.
  • يمكنك إنشاء جدول خارجي باستخدام spark.catalog.createExternalTable الأسلوب. تحدد الجداول الخارجية بيانات التعريف في الكتالوج ولكن تحصل على بياناتها الأساسية من موقع تخزين خارجي؛ عادة ما يكون مجلداً في مستودع بيانات. لا يؤدي حذف جدول خارجي إلى حذف البيانات الأساسية.

استخدام Spark SQL API للاستعلام عن البيانات

يمكنك استخدام Spark SQL API في التعليمات البرمجية المكتوبة بأي لغة للاستعلام عن البيانات في الكتالوج. على سبيل المثال، تستخدم التعليمات البرمجية PySpark التالية استعلام SQL لإرجاع البيانات من عرض المنتجات كإطار بيانات.

bikes_df = spark.sql("SELECT ProductID, ProductName, ListPrice \
                      FROM products \
                      WHERE Category IN ('Mountain Bikes', 'Road Bikes')")
display(bikes_df)

ستبدو النتائج من مثال التعليمات البرمجية مشابهة للجدول التالي:

ProductName ListPrice
Mountain-100 Silver, 38 3399.9900
Road-750 Black, 52 539.9900
... ...

استخدام التعليمات البرمجية SQL

يوضح المثال السابق كيفية استخدام Spark SQL API لتضمين تعبيرات SQL في تعليمة Spark البرمجية. في دفتر الملاحظات، يمكنك أيضاً استخدام %sql السحر لتشغيل التعليمات البرمجية SQL التي تقوم بالاستعلامات عن الكائنات في الكتالوج، مثل هذا:

%sql

SELECT Category, COUNT(ProductID) AS ProductCount
FROM products
GROUP BY Category
ORDER BY Category

يرجع مثال التعليمات البرمجية SQL مجموعة نتائج يتم عرضها تلقائياً في دفتر الملاحظات كجدول، مثل الجدول أدناه:

الفئة عدد المنتجات
Bib-Shorts 3
Bike Racks 1
Bike Stands 1
... ...