Partager via


Comparaison de SparkR et sparklyr

Important

SparkR dans Databricks est déconseillé dans Databricks Runtime 16.0 et versions ultérieures.

Il existe deux API pour les utilisateurs Apache Spark pour R disponibles : SparkR et Sparklyr. Databricks vous recommande d’utiliser sparklyr, car SparkR a été déconseillé. Pour vous aider à migrer votre code, cet article compare ces API.

Origines de l’API

SparkR est créé par la communauté Spark et les développeurs de Databricks. En raison de cela, SparkR suit étroitement les classes Spark Scala et l’API DataFrame.

sparklyr a commencé avec RStudio et a depuis été donné à la Fondation Linux. sparklyr est étroitement intégré au tidyverse à la fois dans son style de programmation et via l’interopérabilité d’API avec dplyr.

SparkR et sparklyr sont hautement capables d’utiliser le Big Data dans R. Au cours des dernières années, leurs ensembles de fonctionnalités se rapprochent de la parité.

Différences entre les API

L’exemple de code suivant montre comment utiliser SparkR et sparklyr à partir d’un notebook Azure Databricks pour lire un fichier CSV à partir des exemples de jeux de données dans 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

Toutefois, si vous essayez d’exécuter une fonction sparklyr sur un SparkDataFrame objet à partir de SparkR ou si vous essayez d’exécuter une fonction SparkR sur un tbl_spark objet à partir de sparklyr, elle ne fonctionnera pas, comme illustré dans l’exemple de code suivant.

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

Cela est dû au fait que sparklyr traduit des fonctions dplyr telles que arrange dans un plan de requête SQL utilisé par SparkSQL. Ce n’est pas le cas avec SparkR, qui a des fonctions pour les tables SparkSQL et les DataFrames Spark. Ces comportements sont la raison pour laquelle Databricks ne recommande pas de combiner les API SparkR et sparklyr dans le même script, notebook ou tâche.

Interopérabilité des API

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

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 obtenir d’autres exemples, consultez Utiliser des DataFrames et des tables dans R.