مشاركة عبر


مقارنة SparkR وsparklyr

يمكن لمستخدمي R الاختيار بين اثنين من واجهات برمجة التطبيقات ل Apache Spark: SparkR وsparklyr. تقارن هذه المقالة واجهات برمجة التطبيقات هذه. توصي Databricks باختيار إحدى واجهات برمجة التطبيقات هذه لتطوير تطبيق Spark في R. يمكن أن يؤدي دمج التعليمات البرمجية من كل من واجهات برمجة التطبيقات هذه في برنامج نصي واحد أو دفتر ملاحظات أو وظيفة Azure Databricks إلى جعل التعليمات البرمجية الخاصة بك أكثر صعوبة في القراءة والصيانة.

أصول واجهة برمجة التطبيقات

تم إنشاء SparkR من قبل مجتمع Spark والمطورين من Databricks. ولهذا السبب، يتبع SparkR عن كثب فئات Spark Scala وDataFrameAPI.

بدأت sparklyr مع RStudio ومنذ ذلك الحين تم التبرع بها لمؤسسة Linux. يتم دمج sparklyr بإحكام في tidyverse في كل من نمط البرمجة ومن خلال إمكانية التشغيل التفاعلي لواجهة برمجة التطبيقات مع dplyr.

SparkR وsparklyr قادران للغاية على العمل مع البيانات الضخمة في R. في غضون السنوات القليلة الماضية، تقترب مجموعات الميزات الخاصة بها من التماثل.

اختلافات واجهات برمجة التطبيقات

يوضح مثال التعليمات البرمجية التالي كيفية استخدام SparkR وsparklyr من دفتر ملاحظات Azure Databricks لقراءة ملف CSV من مجموعات بيانات العينة إلى Spark.

# #############################################################################
# SparkR usage

# Note: To load SparkR into a Databricks notebook, run the following:

# library(SparkR)

# You can then remove "SparkR::" from the following function call.
# #############################################################################

# Use SparkR to read the airlines dataset from 2008.
airlinesDF <- SparkR::read.df(path        = "/databricks-datasets/asa/airlines/2008.csv",
                              source      = "csv",
                              inferSchema = "true",
                              header      = "true")

# Print the loaded dataset's class name.
cat("Class of SparkR object: ", class(airlinesDF), "\n")

# Output:
#
# Class of SparkR object: SparkDataFrame

# #############################################################################
# sparklyr usage

# Note: To install, load, and connect with sparklyr in a Databricks notebook,
# run the following:

# install.packages("sparklyr")
# library(sparklyr)
# sc <- sparklyr::spark_connect(method = "databricks")

# If you run "library(sparklyr)", you can then remove "sparklyr::" from the
# preceding "spark_connect" and from the following function call.
# #############################################################################

# Use sparklyr to read the airlines dataset from 2007.
airlines_sdf <- sparklyr::spark_read_csv(sc   = sc,
                                         name = "airlines",
                                         path = "/databricks-datasets/asa/airlines/2007.csv")

# Print the loaded dataset's class name.
cat("Class of sparklyr object: ", class(airlines_sdf))

# Output:
#
# Class of sparklyr object: tbl_spark tbl_sql tbl_lazy tbl

ومع ذلك، إذا حاولت تشغيل دالة sparklyr على كائن SparkDataFrame من SparkR، أو إذا حاولت تشغيل دالة SparkR على كائن tbl_spark من sparklyr، فلن تعمل، كما هو موضح في مثال التعليمات البرمجية التالي.

# Try to call a sparklyr function on a SparkR SparkDataFrame object. It will not work.
sparklyr::sdf_pivot(airlinesDF, DepDelay ~ UniqueCarrier)

# Output:
#
# Error : Unable to retrieve a Spark DataFrame from object of class SparkDataFrame

## Now try to call s Spark R function on a sparklyr tbl_spark object. It also will not work.
SparkR::arrange(airlines_sdf, "DepDelay")

# Output:
#
# Error in (function (classes, fdef, mtable) :
#   unable to find an inherited method for function ‘arrange’ for signature ‘"tbl_spark", "character"’

وذلك لأن sparklyr يترجم وظائف dplyr مثل arrange إلى خطة استعلام SQL التي يستخدمها SparkSQL. هذا ليس هو الحال مع SparkR، الذي يحتوي على وظائف لجداول SparkSQL وSpark DataFrames. هذه السلوكيات هي السبب في أن Databricks لا ينصح بالجمع بين SparkR وواجهات برمجة التطبيقات sparklyr في نفس البرنامج النصي أو دفتر الملاحظات أو الوظيفة نفسها.

إمكانية التشغيل التفاعلي لواجهة برمجة التطبيقات

في حالات نادرة حيث لا يمكنك تجنب الجمع بين SparkR وواجهات برمجة التطبيقات sparklyr، يمكنك استخدام SparkSQL كنوع من الجسر. على سبيل المثال، في المثال الأول لهذه المقالة، حملت sparklyr مجموعة بيانات شركات الطيران من عام 2007 إلى جدول يسمى airlines. يمكنك استخدام الدالة SparkR sql للاستعلام عن هذا الجدول، على سبيل المثال:

top10delaysDF <- SparkR::sql("SELECT
                               UniqueCarrier,
                               DepDelay,
                               Origin
                             FROM
                               airlines
                             WHERE
                               DepDelay NOT LIKE 'NA'
                             ORDER BY DepDelay
                             DESC LIMIT 10")

# Print the class name of the query result.
cat("Class of top10delaysDF: ", class(top10delaysDF), "\n\n")

# Show the query result.
cat("Top 10 airline delays for 2007:\n\n")
head(top10delaysDF, 10)

# Output:
#
# Class of top10delaysDF: SparkDataFrame
#
# Top 10 airline delays for 2007:
#
#   UniqueCarrier DepDelay Origin
# 1            AA      999    RNO
# 2            NW      999    EWR
# 3            AA      999    PHL
# 4            MQ      998    RST
# 5            9E      997    SWF
# 6            AA      996    DFW
# 7            NW      996    DEN
# 8            MQ      995    IND
# 9            MQ      994    SJT
# 10           AA      993    MSY

للحصول على أمثلة إضافية، راجع العمل مع DataFrames والجداول في R.