Apache Spark és un motor de processament de dades de codi obert que permet processar grans volums de dades de manera ràpida i eficient. Spark és conegut per la seva velocitat i facilitat d'ús, i és àmpliament utilitzat en aplicacions de big data. En aquest tema, aprendrem com utilitzar Spark amb Scala per processar dades.
Objectius del Tema
- Entendre què és Apache Spark i les seves característiques principals.
- Configurar un projecte Spark amb Scala.
- Escriure i executar aplicacions Spark bàsiques.
- Treballar amb RDDs (Resilient Distributed Datasets) i DataFrames.
- Què és Apache Spark?
Apache Spark és un motor de processament de dades distribuït que proporciona una interfície per a la programació de clústers complets amb paral·lelisme implícit i tolerància a fallades. Les seves característiques principals inclouen:
- Velocitat: Spark pot processar dades a gran velocitat gràcies a la seva capacitat de mantenir dades en memòria.
- Facilitat d'ús: Proporciona APIs senzilles en Scala, Java, Python i R.
- Generalitat: Suporta una àmplia gamma de càrregues de treball, incloent-hi processament de lots, processament de fluxos, i aprenentatge automàtic.
- Compatibilitat amb Hadoop: Pot funcionar independentment o en un clúster Hadoop.
- Configuració del Projecte Spark amb Scala
Requisits Previs
- Java Development Kit (JDK) instal·lat.
- Apache Spark descarregat i configurat.
- SBT (Scala Build Tool) instal·lat.
Configuració del Projecte
-
Crear un nou projecte SBT:
sbt new scala/scala-seed.g8
-
Afegir dependències de Spark al fitxer
build.sbt
:name := "SparkWithScala" version := "0.1" scalaVersion := "2.12.10" libraryDependencies ++= Seq( "org.apache.spark" %% "spark-core" % "3.1.2", "org.apache.spark" %% "spark-sql" % "3.1.2" )
-
Compilar el projecte:
sbt compile
- Escriure i Executar una Aplicació Spark Bàsica
Exemple: Comptar Paraules
-
Crear un fitxer Scala: Crea un fitxer anomenat
WordCount.scala
dins del directorisrc/main/scala
. -
Escriure el codi:
import org.apache.spark.{SparkConf, SparkContext} object WordCount { def main(args: Array[String]): Unit = { val conf = new SparkConf().setAppName("WordCount").setMaster("local[*]") val sc = new SparkContext(conf) val textFile = sc.textFile("path/to/textfile.txt") val counts = textFile.flatMap(line => line.split(" ")) .map(word => (word, 1)) .reduceByKey(_ + _) counts.saveAsTextFile("path/to/output") } }
-
Executar l'aplicació:
sbt run
- Treballar amb RDDs i DataFrames
RDDs (Resilient Distributed Datasets)
RDDs són la unitat fonamental de dades en Spark. Són col·leccions distribuïdes d'objectes que es poden processar en paral·lel.
Exemple: Operacions amb RDDs
val data = sc.parallelize(Seq(1, 2, 3, 4, 5)) val result = data.map(_ * 2).collect() result.foreach(println)
DataFrames
DataFrames són col·leccions distribuïdes de dades organitzades en columnes nominals, similars a les taules en bases de dades relacionals.
Exemple: Operacions amb DataFrames
import org.apache.spark.sql.SparkSession val spark = SparkSession.builder.appName("DataFrameExample").getOrCreate() val df = spark.read.json("path/to/jsonfile.json") df.show() df.printSchema() df.select("name").show() df.filter(df("age") > 21).show() df.groupBy("age").count().show()
Exercicis Pràctics
Exercici 1: Comptar Paraules en un Fitxer de Text
- Escriu una aplicació Spark que llegeixi un fitxer de text i compti el nombre d'ocurrències de cada paraula.
- Guarda el resultat en un fitxer de sortida.
Exercici 2: Operacions amb DataFrames
- Crea un DataFrame a partir d'un fitxer JSON.
- Realitza operacions de selecció, filtratge i agrupació sobre el DataFrame.
Solucions
Solució a l'Exercici 1
import org.apache.spark.{SparkConf, SparkContext} object WordCount { def main(args: Array[String]): Unit = { val conf = new SparkConf().setAppName("WordCount").setMaster("local[*]") val sc = new SparkContext(conf) val textFile = sc.textFile("path/to/textfile.txt") val counts = textFile.flatMap(line => line.split(" ")) .map(word => (word, 1)) .reduceByKey(_ + _) counts.saveAsTextFile("path/to/output") } }
Solució a l'Exercici 2
import org.apache.spark.sql.SparkSession object DataFrameExample { def main(args: Array[String]): Unit = { val spark = SparkSession.builder.appName("DataFrameExample").getOrCreate() val df = spark.read.json("path/to/jsonfile.json") df.show() df.printSchema() df.select("name").show() df.filter(df("age") > 21).show() df.groupBy("age").count().show() } }
Resum
En aquest tema, hem après què és Apache Spark i com configurar un projecte Spark amb Scala. Hem escrit i executat una aplicació Spark bàsica per comptar paraules en un fitxer de text. També hem explorat com treballar amb RDDs i DataFrames, dues de les estructures de dades més importants en Spark. Finalment, hem proporcionat exercicis pràctics per reforçar els conceptes apresos.
Curs de Programació en Scala
Mòdul 1: Introducció a Scala
- Introducció a Scala
- Configuració de l'Entorn de Desenvolupament
- Conceptes Bàsics de Scala: Sintaxi i Estructura
- Variables i Tipus de Dades
- Operacions Bàsiques i Expressions
Mòdul 2: Estructures de Control i Funcions
- Declaracions Condicionals
- Bucles i Iteracions
- Funcions i Mètodes
- Funcions d'Ordre Superior
- Funcions Anònimes
Mòdul 3: Col·leccions i Estructures de Dades
- Introducció a les Col·leccions
- Llistes i Arrays
- Conjunts i Mapes
- Tuples i Options
- Coincidència de Patrons
Mòdul 4: Programació Orientada a Objectes en Scala
- Classes i Objectes
- Herència i Traits
- Classes Abstractes i Classes Case
- Objectes Companys
- Objectes Singleton
Mòdul 5: Programació Funcional en Scala
- Immutabilitat i Funcions Pures
- Estructures de Dades Funcionals
- Monads i Functors
- For-Comprehensions
- Gestió d'Errors en la Programació Funcional
Mòdul 6: Conceptes Avançats de Scala
- Conversions i Paràmetres Implícits
- Classes de Tipus i Polimorfisme
- Macros i Reflexió
- Concurrència en Scala
- Introducció a Akka