Aller au contenu principal

Comparaison entre SparkR et sparklyr

important

SparkR dans Databricks est déprécié dans Databricks Runtime 16.0 et versions ultérieures. Pour plus d'informations sur la migration vers sparklyr, consultez Migrer de SparkR vers sparklyr.

Deux APIs pour Apache Spark sont disponibles pour les utilisateurs R : SparkR et sparklyr. Databricks vous recommande d'utiliser sparklyr, car SparkR a été obsolète. Pour vous aider à migrer votre code, cet article compare ces APIs.

Origines de l’API

SparkR est développé par la Communauté Spark et les développeurs de Databricks. De ce fait, SparkR suit de près les classes Scala de Spark et l'API DataFrame.

sparklyr a commencé avec RStudio et a depuis été donné à la Linux Foundation. sparklyr est étroitement intégré au tidyverse, tant dans son style de programmation que par l'interopérabilité de l'API avec dplyr.

SparkR et sparklyr sont très capables de travailler avec le Big Data en R. Au cours des dernières années, leurs ensembles de fonctionnalités se sont rapprochés de la parité.

Différences de l'API

L'exemple de code suivant montre comment utiliser SparkR et sparklyr à partir d'un Notebook Databricks pour lire un fichier CSV depuis les exemples de datasets dans Spark.

R
# #############################################################################
# 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

Cependant, si vous essayez d'exécuter une fonction sparklyr sur un objet SparkDataFrame de SparkR, ou si vous essayez d'exécuter une fonction SparkR sur un objet tbl_spark de sparklyr, cela ne fonctionnera pas, comme le montre l'exemple de code suivant.

R
# 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"'

C’est parce que sparklyr traduit des fonctions dplyr telles que arrange en un plan de query SQL utilisé par SparkSQL. Ce n'est pas le cas avec SparkR, qui dispose de fonctions pour les tables SparkSQL et les DataFrames Spark. Ces comportements expliquent pourquoi Databricks ne recommande pas de combiner les APIs SparkR et sparklyr dans le même script, Notebook ou Job.

Interopérabilité des API

Dans les rares cas où vous ne pouvez pas éviter de combiner les API SparkR et sparklyr, vous pouvez utiliser SparkSQL comme une sorte de pont. Par exemple, dans le premier exemple de cet article, sparklyr a chargé le dataset des compagnies aériennes de 2007 dans une table nommée airlines. Vous pouvez utiliser la fonction SparkR sql pour query cette table, par exemple :

R
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

Pour d'autres exemples, consultez Travailler avec des DataFrames et des tables dans R.