Comparación entre SparkR y sparklyr
Los usuarios de R pueden elegir entre dos API para Apache Spark: SparkR y sparklyr. En este artículo se comparan estas API. Databricks recomienda elegir una de estas API para desarrollar una aplicación Spark en R. La combinación de código de ambas API en un único script o trabajo de Azure Databricks puede dificultar la lectura y el mantenimiento del código.
Orígenes de las API
La API SparkR ha sido creada por la comunidad de Spark y los desarrolladores de Databricks. Por este motivo, SparkR sigue estrechamente las Clases de Scala y la API de DataFrame de Spark.
La API sparklyr comenzó con RStudio y desde entonces se ha donado a la Fundación Linux. sparklyr está estrechamente integrado en el tidyverse tanto en su estilo de programación como en 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 han acercado 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 ejemplo 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
Pero si intenta ejecutar una función de sparklyr en un objeto SparkDataFrame
desde SparkR, o ejecutar una función de SparkR en un objeto tbl_spark
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 de dplyr como arrange
en un plan de consulta SQL que SparkSQL usa. Este no es el caso de SparkR, que tiene funciones para tablas SparkSQL y DataFrames de Spark. Estos comportamientos son los motivos por los que Databricks no recomienda combinar las API de SparkR y sparklyr en el mismo script, cuaderno o trabajo.
Interoperabilidad API
En casos excepcionales en los que no puede evitar combinar las API de SparkR y sparklyr, puede usar SparkSQL como 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 sql
de SparkR para consultar esta tabla, por ejemplo, de la manera siguiente:
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.