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.

// Seleccionar la columna "nom"
val noms = datasetPersones.select("nom")
noms.show()

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

  1. Defineix una classe de cas Producte amb els camps nom (String) i preu (Double).
  2. Crea un Dataset de productes a partir d'una llista de Scala.
  3. Selecciona només els noms dels productes.
  4. Filtra els productes amb un preu superior a 50.
  5. 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

  1. Crea un Dataset de persones a partir d'una llista de Scala.
  2. Incrementa l'edat de cada persona en 5 anys utilitzant una transformació map.
  3. 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.

© Copyright 2024. Tots els drets reservats