Introducción a SparkR

SparkR es un paquete de R que proporciona un front-end ligero para usar Apache Spark desde R. SparkR también admite el aprendizaje automático distribuido mediante MLlib.

Referencia de funciones de SparkR

Puede encontrar la referencia de funciones de SparkR más reciente en spark.apache.org.

También puede ver la ayuda de las funciones en Cuadernos de R o RStudio después de importar el paquete SparkR.

Embedded R documentation

SparkR en cuadernos

  • En el caso de Spark 2.0 y versiones posteriores, no es necesario pasar explícitamente un objeto sqlContext a cada llamada de función.
  • En el caso de Spark 2.2 y versiones posteriores, los cuadernos ya no importan SparkR de manera predeterminada, porque las funciones de SparkR entraban en conflicto con funciones con nombres similares de otros paquetes populares. Para usar SparkR, puede llamar a library(SparkR) en los cuadernos. La sesión de SparkR ya está configurada y todas las funciones de SparkR se comunicarán con el clúster asociado mediante la sesión existente.

SparkR en trabajos de spark-submit

Puede ejecutar scripts que usen SparkR en Azure Databricks como trabajos de spark-submit, con modificaciones de código menores.

Creación de DataFrames de SparkR

Puede crear un DataFrame desde un objeto data.frame local de R, desde un origen de datos o mediante una consulta de Spark SQL.

Desde un objeto data.frame local de R

La manera más sencilla de crear un DataFrame es convertir un objeto data.frame local de R en un objeto SparkDataFrame. En concreto, podemos usar createDataFrame y pasar el objeto data.frame local de R para crear un objeto SparkDataFrame. Al igual que la mayoría de las demás funciones de SparkR, la sintaxis de createDataFrame cambió en Spark 2.0. Puede ver ejemplos de esto en el fragmento de código siguiente. Para ver más ejemplos, consulte createDataFrame.

library(SparkR)
df <- createDataFrame(faithful)

# Displays the content of the DataFrame to stdout
head(df)

Mediante la API de origen de datos

El método general para crear un DataFrame a partir de un origen de datos es read.df. Este método toma la ruta de acceso del archivo que se va a cargar y el tipo de origen de datos. SparkR admite la lectura de archivos de texto, CSV, JSON y Parquet de forma nativa.

library(SparkR)
diamondsDF <- read.df("/databricks-datasets/Rdatasets/data-001/csv/ggplot2/diamonds.csv", source = "csv", header="true", inferSchema = "true")
head(diamondsDF)

SparkR deduce automáticamente el esquema del archivo CSV.

Adición de un conector de origen de datos con Spark Packages

A través de Spark Packages puede encontrar conectores de origen de datos para formatos de archivo populares como Avro. Por ejemplo, use el paquete spark-avro para cargar un archivo Avro. La disponibilidad del paquete spark-avro depende de la versión del clúster. Consulte Archivo Avro.

En primer lugar, tome un objeto data.frame existente, conviértalo en un DataFrame de Spark y guárdelo como un archivo Avro.

require(SparkR)
irisDF <- createDataFrame(iris)
write.df(irisDF, source = "com.databricks.spark.avro", path = "dbfs:/tmp/iris.avro", mode = "overwrite")

Para comprobar que se guardó un archivo Avro:

%fs ls /tmp/iris.avro

Ahora, use de nuevo el paquete spark-avro para volver a leer los datos.

irisDF2 <- read.df(path = "/tmp/iris.avro", source = "com.databricks.spark.avro")
head(irisDF2)

La API de origen de datos también se puede usar para guardar DataFrames en varios formatos de archivo. Por ejemplo, puede guardar el DataFrame del ejemplo anterior en un archivo Parquet mediante write.df.

write.df(irisDF2, path="dbfs:/tmp/iris.parquet", source="parquet", mode="overwrite")
%fs ls dbfs:/tmp/iris.parquet

Desde una consulta de Spark SQL

También se puede crear dataframes de SparkR mediante consultas de SQL Spark.

# Register earlier df as temp view
createOrReplaceTempView(irisDF2, "irisTemp")
# Create a df consisting of only the 'species' column using a Spark SQL query
species <- sql("SELECT species FROM irisTemp")

species es un objeto SparkDataFrame.

Operaciones de dataframe

Los DataFrames de Spark admiten una serie de funciones para realizar el procesamiento de datos estructurados. A continuación se muestran algunos ejemplos básicos. Puede consultar una lista completa en la documentación de la API.

Selección de filas y columnas

# Import SparkR package if this is a new notebook
require(SparkR)

# Create DataFrame
df <- createDataFrame(faithful)
# Select only the "eruptions" column
head(select(df, df$eruptions))
# You can also pass in column name as strings
head(select(df, "eruptions"))
# Filter the DataFrame to only retain rows with wait times shorter than 50 mins
head(filter(df, df$waiting < 50))

Agrupación y agregación

Los objetos SparkDataFrame admiten una serie de funciones de uso frecuente para agregar datos después de la agrupación. Por ejemplo, puede contar el número de veces que aparece cada tiempo de espera en el conjunto de datos fiel.

head(count(groupBy(df, df$waiting)))
# You can also sort the output from the aggregation to get the most common waiting times
waiting_counts <- count(groupBy(df, df$waiting))
head(arrange(waiting_counts, desc(waiting_counts$count)))

Operaciones de columna

SparkR proporciona varias funciones que se pueden aplicar directamente a las columnas para el procesamiento y la agregación de datos. En el ejemplo siguiente se muestra el uso de funciones aritméticas básicas.

# Convert waiting time from hours to seconds.
# You can assign this to a new column in the same DataFrame
df$waiting_secs <- df$waiting * 60
head(df)

Aprendizaje automático

SparkR expone la mayoría de los algoritmos de MLLib. En segundo plano, SparkR usa MLlib para entrenar el modelo.

En el ejemplo siguiente se muestra cómo crear un modelo GLM gausiano mediante SparkR. Para ejecutar la regresión lineal, establezca el valor de "family" en "gaussian". Para ejecutar la regresión logística, establezca el valor de "family" en "binomial". Cuando se usa SparkML GLM, SparkR realiza automáticamente la codificación "one-hot" de características categóricas para que no sea necesario realizarla manualmente. Además de las características de tipo cadena y doble, también es posible ajustarse a las características de vector de MLlib, por compatibilidad con otros componentes de MLlib.

# Create the DataFrame
df <- createDataFrame(iris)

# Fit a linear model over the dataset.
model <- glm(Sepal_Length ~ Sepal_Width + Species, data = df, family = "gaussian")

# Model coefficients are returned in a similar format to R's native glm().
summary(model)

Para ver tutoriales, consulte Tutorial: análisis de datos con glm.

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