Compartir a través de


Comparación entre SparkR y sparklyr

Importante

SparkR en Databricks está en desuso en Databricks Runtime 16.0 y versiones posteriores.

Hay dos API para los usuarios de Apache Spark para R disponibles: SparkR y sparklyr. Databricks recomienda usar sparklyr, ya que SparkR ha quedado en desuso. Para ayudarle a migrar el código, en este artículo se comparan estas API.

Orígenes de API

SparkR se crea mediante la comunidad de Spark y los desarrolladores de Databricks. Por este motivo, SparkR sigue detenidamente las clases de Scala de Spark y dataFrame API.

Sparklyr comenzó con RStudio y desde entonces se ha donado a Linux Foundation. sparklyr está estrechamente integrado en el tidyverse en su estilo de programación y a través de la interoperabilidad de API con dplyr.

SparkR y sparklyr son altamente capaces de trabajar con macrodatos en R. En los últimos años, sus conjuntos de características se acercan a la paridad.

Diferencias entre las API

En el ejemplo de código siguiente se muestra cómo usar SparkR y sparklyr desde un cuaderno de Azure Databricks para leer un archivo CSV de los conjuntos de datos de muestra en 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

Sin embargo, si intenta ejecutar una función sparklyr en un SparkDataFrame objeto de SparkR, o si intenta ejecutar una función sparkR en un tbl_spark objeto desde sparklyr, no funcionará, como se muestra en el ejemplo de código siguiente.

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

Esto se debe a que sparklyr traduce funciones dplyr, como arrange en un plan de consulta SQL que usa SparkSQL. Este no es el caso de SparkR, que tiene funciones para tablas SparkSQL y DataFrames de Spark. Estos comportamientos son el motivo por el que Databricks no recomienda combinar SparkR y las API de sparklyr en el mismo script, cuaderno o trabajo.

Interoperabilidad de API

En casos poco frecuentes en los que no puede evitar combinar las API de SparkR y sparklyr, puede usar SparkSQL como un tipo de puente. Por ejemplo, en el primer ejemplo de este artículo, sparklyr cargó el conjunto de datos de líneas aéreas de 2007 en una tabla denominada airlines. Puede usar la función SparkR sql para consultar esta tabla, por ejemplo:

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

Para ver más ejemplos, consulte Trabajo con DataFrames y tablas en R.