Guı́a Introductoria a Scala sobre Apache Spark
Dr. Julio Lopez-Nunez
Octubre-2024
Contents
1 Introducción 2
1.1 ¿Qué es Scala? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Lenguajes Compatibles con Spark . . . . . . . . . . . . . . . . . . 2
1.3 Componentes Principales de Apache Spark . . . . . . . . . . . . 2
1.4 Apache Spark SQL . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2 Conceptos Clave 3
2.1 Resilient Distributed Dataset (RDD) . . . . . . . . . . . . . . . . 3
2.2 DataFrames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.3 Invariabilidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.4 Transformaciones y Acciones . . . . . . . . . . . . . . . . . . . . 3
2.5 La función reduceByKey . . . . . . . . . . . . . . . . . . . . . . . 3
3 Ejercicios Prácticos 4
3.1 Ejercicio 1: Crear un RDD . . . . . . . . . . . . . . . . . . . . . 4
3.2 Ejercicio 2: Suma de Elementos de un RDD . . . . . . . . . . . . 4
3.3 Ejercicio 3: Usar reduceByKey para Agrupar Datos . . . . . . . . 4
3.4 Ejercicio 4: Crear un DataFrame desde un RDD . . . . . . . . . 4
3.5 Ejercicio 5: Leer un archivo CSV desde HDFS . . . . . . . . . . . 4
4 Ejercicios Avanzados 5
4.1 Ejercicio 6: Crear una tabla particionada . . . . . . . . . . . . . 5
4.2 Ejercicio 7: Leer un archivo JSON desde HDFS . . . . . . . . . . 5
5 Ejercicios Propuestos (Sin Respuesta) 6
5.1 Nivel Sencillo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
5.2 Nivel Medio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
5.3 Nivel Complejo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1
1 Introducción
Apache Spark es un motor de análisis de datos de propósito general, diseñado
para procesar grandes volúmenes de datos de manera rápida y eficiente. Spark
permite ejecutar operaciones en memoria, lo que lo hace significativamente más
rápido que otros motores de procesamiento como MapReduce.
En esta guı́a aprenderás cómo trabajar con SCALA sobre Spark, basado en
una arquitectura de Hadoop implementada con Docker. Esta arquitectura se ex-
plica en el repositorio de GitHub de Juliopez (https://github.com/juliopez/Hadoop).
1.1 ¿Qué es Scala?
Scala es un lenguaje de programación que combina caracterı́sticas de la progra-
mación orientada a objetos y la programación funcional. Es el lenguaje más
utilizado para escribir aplicaciones que corren sobre Apache Spark, debido a su
eficiencia y compatibilidad con la JVM (Java Virtual Machine).
1.2 Lenguajes Compatibles con Spark
Apache Spark soporta varios lenguajes de programación, como:
Scala
Python (PySpark)
Java
R (SparkR)
1.3 Componentes Principales de Apache Spark
Los componentes principales de la arquitectura de Spark son:
Spark Core: Proporciona las funciones básicas de Spark como la gestión
de memoria, tareas, almacenamiento de datos y recuperación de fallos.
Spark SQL: Permite la ejecución de consultas SQL sobre datos estruc-
turados.
Spark Streaming: Procesamiento de flujos de datos en tiempo real.
MLlib: Librerı́a para aprendizaje automático.
GraphX: Para procesar grafos y realizar análisis gráficos.
2
1.4 Apache Spark SQL
Apache Spark también soporta operaciones SQL. Permite realizar acciones como:
Crear vistas y tablas
Consultar datos usando SELECT
Agrupar, unir y filtrar datos
2 Conceptos Clave
2.1 Resilient Distributed Dataset (RDD)
Un RDD es una colección distribuida de objetos inmutables. Es la abstracción
principal en Spark para el manejo de datos distribuidos y permite aplicar op-
eraciones paralelas.
2.2 DataFrames
Los DataFrames son similares a las tablas en bases de datos relacionales. Pro-
porcionan una abstracción de alto nivel sobre los RDDs, permitiendo manipular
datos tabulares con funciones similares a SQL.
2.3 Invariabilidad
Los RDDs y DataFrames en Spark son inmutables, lo que significa que una vez
que son creados no pueden ser modificados. Las transformaciones aplicadas a
un RDD devuelven un nuevo RDD.
2.4 Transformaciones y Acciones
Transformaciones: Operaciones que se aplican a un RDD y generan un nuevo
RDD, como map, filter, y reduceByKey.
Acciones: Operaciones que ejecutan cálculos y devuelven un valor final,
como count, collect, y saveAsTextFile.
2.5 La función reduceByKey
reduceByKey es una transformación en Spark que combina valores por clave uti-
lizando una función de reducción (como suma o promedio). Se aplica comúnmente
para agrupar resultados de manera eficiente.
3
3 Ejercicios Prácticos
3.1 Ejercicio 1: Crear un RDD
Cree un RDD desde una lista de enteros y aplique una transformación para
filtrar los números pares.
val data = sc . parallelize ( List (1 , 2 , 3 , 4 , 5 , 6))
val evenNumbers = data . filter ( x = > x % 2 = = 0)
evenNumbers . collect () // Resultado : Array (2 , 4 , 6)
3.2 Ejercicio 2: Suma de Elementos de un RDD
Cree un RDD desde una lista de números y utilice la acción reduce para sumar
todos los elementos.
val data = sc . parallelize ( List (1 , 2 , 3 , 4 , 5))
val sum = data . reduce (( a , b ) = > a + b )
println ( sum ) // Resultado : 15
3.3 Ejercicio 3: Usar reduceByKey para Agrupar Datos
Dado un RDD de pares clave-valor, agrupe los valores por clave y calcule la
suma de cada grupo.
val data = sc . parallelize ( List (( " a " , 1) , ( " b " , 1) , ( " a " , 2) , ( " b " , 2)))
val result = data . reduceByKey (( x , y ) = > x + y )
result . collect () // Resultado : Array ((" a " , 3) , (" b " , 3))
3.4 Ejercicio 4: Crear un DataFrame desde un RDD
Cree un DataFrame desde un RDD de pares clave-valor y muestre el contenido.
val data = sc . parallelize ( List (( " Alice " , 20) , ( " Bob " , 25)))
val df = data . toDF ( " name " , " age " )
df . show ()
// + - - - - -+ - - -+
// | name | age |
// + - - - - -+ - - -+
// | Alice | 20|
// | Bob | 25|
3.5 Ejercicio 5: Leer un archivo CSV desde HDFS
Lea un archivo CSV almacenado en HDFS y conviértalo en un DataFrame.
val df = spark . read . option ( " header " , " true " ). csv ( " hdfs : // path / to / file . csv " )
df . show ()
4
4 Ejercicios Avanzados
4.1 Ejercicio 6: Crear una tabla particionada
Cree una tabla Hive particionada por una columna de fecha.
CREATE TABLE logs (
id INT ,
usuario STRING ,
pagina STRING
)
PARTITIONED BY ( fecha STRING )
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ’ , ’;
4.2 Ejercicio 7: Leer un archivo JSON desde HDFS
Lea un archivo JSON desde HDFS y conviértalo en un DataFrame.
val df = spark . read . json ( " hdfs : // path / to / file . json " )
df . show ()
5
5 Ejercicios Propuestos (Sin Respuesta)
5.1 Nivel Sencillo
Crear un RDD desde una lista de strings.
Aplicar una transformación para contar el número de palabras en cada
string.
5.2 Nivel Medio
Crear un DataFrame desde un archivo CSV en HDFS.
Filtrar los registros con un valor especı́fico en una columna.
5.3 Nivel Complejo
Crear una tabla Hive desde un DataFrame y realizar consultas SQL.
Usar reduceByKey para procesar grandes volúmenes de datos.