En aquest tema, aprendrem a treballar amb Datasets en Apache Spark. Els Datasets són una extensió dels DataFrames que proporcionen una API de tipus fort per a la manipulació de dades. Això significa que els Datasets poden oferir avantatges de rendiment i seguretat en temps de compilació gràcies a la seva capacitat per detectar errors de tipus.
Continguts
Què és un Dataset?
Un Dataset és una col·lecció distribuïda de dades que es pot processar utilitzant l'API de Spark. Els Datasets combinen els avantatges dels RDDs (Resilient Distributed Datasets) i els DataFrames, oferint una API de tipus fort que permet la detecció d'errors en temps de compilació.
Característiques dels Datasets
- Tipus Fort: Els Datasets són tipus forts, el que significa que Spark pot detectar errors de tipus en temps de compilació.
- Optimització: Els Datasets es beneficien de les optimitzacions del Catalyst optimizer de Spark.
- API Rica: Proporcionen una API rica per a la manipulació de dades, similar a la dels DataFrames.
Creació de Datasets
Exemple de Creació de Datasets
Per crear un Dataset, primer necessitem definir una classe de cas (case class) que representi l'estructura de les dades. A continuació, podem crear un Dataset a partir d'una col·lecció de Scala o llegint dades d'una font externa.
// Definim una classe de cas case class Persona(nom: String, edat: Int) // Creem una llista de persones val persones = Seq(Persona("Joan", 30), Persona("Anna", 25), Persona("Pere", 40)) // Convertim la llista a un Dataset import spark.implicits._ val datasetPersones = persones.toDS() // Mostrem el Dataset datasetPersones.show()
Llegir Datasets des de Fonts Externes
Podem llegir Datasets des de diverses fonts de dades, com ara fitxers CSV, JSON, Parquet, etc.
// Llegir un Dataset des d'un fitxer CSV val datasetCSV = spark.read.option("header", "true").csv("path/to/file.csv").as[Persona] // Llegir un Dataset des d'un fitxer JSON val datasetJSON = spark.read.json("path/to/file.json").as[Persona]
Operacions Bàsiques amb Datasets
Selecció de Columnes
Podem seleccionar columnes específiques d'un Dataset utilitzant la funció select
.
Filtratge de Dades
Podem filtrar les dades d'un Dataset utilitzant la funció filter
.
// Filtrar persones amb edat superior a 30 val personesMajors = datasetPersones.filter($"edat" > 30) personesMajors.show()
Ordenació de Dades
Podem ordenar les dades d'un Dataset utilitzant la funció orderBy
.
// Ordenar persones per edat val personesOrdenades = datasetPersones.orderBy($"edat") personesOrdenades.show()
Transformacions i Accions amb Datasets
Transformacions
Les transformacions són operacions que retornen un nou Dataset, com ara map
, flatMap
, filter
, etc.
// Transformació map per incrementar l'edat de cada persona en 1 val personesIncrementades = datasetPersones.map(persona => Persona(persona.nom, persona.edat + 1)) personesIncrementades.show()
Accions
Les accions són operacions que retornen un valor o efectuen una acció sobre el Dataset, com ara count
, collect
, show
, etc.
// Acció count per comptar el nombre de persones val numPersones = datasetPersones.count() println(s"Nombre de persones: $numPersones")
Exercicis Pràctics
Exercici 1: Creació i Manipulació de Datasets
- Defineix una classe de cas
Producte
amb els campsnom
(String) ipreu
(Double). - Crea un Dataset de productes a partir d'una llista de Scala.
- Selecciona només els noms dels productes.
- Filtra els productes amb un preu superior a 50.
- Ordena els productes per preu de manera descendent.
Solució
// 1. Definició de la classe de cas case class Producte(nom: String, preu: Double) // 2. Creació del Dataset val productes = Seq(Producte("Ordinador", 1000.0), Producte("Ratolí", 25.0), Producte("Teclat", 75.0)).toDS() // 3. Selecció dels noms dels productes val nomsProductes = productes.select("nom") nomsProductes.show() // 4. Filtratge dels productes amb preu superior a 50 val productesCars = productes.filter($"preu" > 50) productesCars.show() // 5. Ordenació dels productes per preu de manera descendent val productesOrdenats = productes.orderBy($"preu".desc) productesOrdenats.show()
Exercici 2: Transformacions i Accions amb Datasets
- Crea un Dataset de persones a partir d'una llista de Scala.
- Incrementa l'edat de cada persona en 5 anys utilitzant una transformació
map
. - Compta el nombre de persones amb edat superior a 30.
Solució
// 1. Creació del Dataset val persones = Seq(Persona("Joan", 30), Persona("Anna", 25), Persona("Pere", 40)).toDS() // 2. Increment de l'edat de cada persona en 5 anys val personesIncrementades = persones.map(persona => Persona(persona.nom, persona.edat + 5)) personesIncrementades.show() // 3. Comptar el nombre de persones amb edat superior a 30 val numPersonesMajors = personesIncrementades.filter($"edat" > 30).count() println(s"Nombre de persones amb edat superior a 30: $numPersonesMajors")
Conclusió
En aquest tema, hem après què són els Datasets, com crear-los i com realitzar operacions bàsiques i avançades amb ells. Els Datasets combinen els avantatges dels RDDs i els DataFrames, oferint una API de tipus fort que permet la detecció d'errors en temps de compilació i optimitzacions avançades. Hem vist exemples pràctics de creació, manipulació i transformació de Datasets, així com exercicis per reforçar els conceptes apresos. En el proper tema, explorarem la gestió de dades faltants en Spark.
Curs d'Apache Spark
Mòdul 1: Introducció a Apache Spark
Mòdul 2: Conceptes Bàsics de Spark
Mòdul 3: Processament de Dades amb Spark
Mòdul 4: Programació Avançada amb Spark
Mòdul 5: Optimització i Millora del Rendiment
- Comprendre les Tasques de Spark
- Emmagatzematge en Memòria i Persistència
- Gestió de Memòria
- Optimització d'Aplicacions Spark
Mòdul 6: Spark al Núvol
Mòdul 7: Aplicacions del Món Real i Estudis de Cas
- Processament de Dades en Temps Real
- Anàlisi de Big Data
- Pipelines d'Aprenentatge Automàtic
- Estudis de Cas