En aquest tema, explorarem dos conceptes fonamentals en Apache Spark: les transformacions i les accions. Aquests conceptes són essencials per treballar amb RDDs (Resilient Distributed Datasets) i altres estructures de dades en Spark.
Què són les Transformacions?
Les transformacions són operacions que es realitzen sobre un RDD per crear un nou RDD. Les transformacions són "lazy", és a dir, no s'executen immediatament. En lloc d'això, Spark construeix un pla d'execució que s'executa només quan es crida a una acció.
Tipus de Transformacions
-
map(funció):
- Aplica una funció a cada element de l'RDD i retorna un nou RDD amb els resultats.
rdd = sc.parallelize([1, 2, 3, 4]) rdd2 = rdd.map(lambda x: x * 2) print(rdd2.collect()) # Sortida: [2, 4, 6, 8]
-
filter(funció):
- Filtra els elements de l'RDD que compleixen una condició donada.
rdd = sc.parallelize([1, 2, 3, 4]) rdd2 = rdd.filter(lambda x: x % 2 == 0) print(rdd2.collect()) # Sortida: [2, 4]
-
flatMap(funció):
- Aplica una funció a cada element de l'RDD i retorna un nou RDD amb els resultats aplanats.
rdd = sc.parallelize(["Hello World", "Apache Spark"]) rdd2 = rdd.flatMap(lambda x: x.split(" ")) print(rdd2.collect()) # Sortida: ['Hello', 'World', 'Apache', 'Spark']
-
distinct():
- Retorna un nou RDD amb els elements únics de l'RDD original.
rdd = sc.parallelize([1, 2, 2, 3, 3, 3]) rdd2 = rdd.distinct() print(rdd2.collect()) # Sortida: [1, 2, 3]
-
union(rdd):
- Retorna un nou RDD que conté la unió dels elements de l'RDD original i un altre RDD.
rdd1 = sc.parallelize([1, 2, 3]) rdd2 = sc.parallelize([3, 4, 5]) rdd3 = rdd1.union(rdd2) print(rdd3.collect()) # Sortida: [1, 2, 3, 3, 4, 5]
Què són les Accions?
Les accions són operacions que triguen a executar-se i retornen un valor al driver program o escriuen dades a un sistema d'emmagatzematge extern. Les accions forcen l'execució de les transformacions "lazy".
Tipus d'Accions
-
collect():
- Retorna tots els elements de l'RDD com una llista.
rdd = sc.parallelize([1, 2, 3, 4]) result = rdd.collect() print(result) # Sortida: [1, 2, 3, 4]
-
count():
- Retorna el nombre d'elements de l'RDD.
rdd = sc.parallelize([1, 2, 3, 4]) result = rdd.count() print(result) # Sortida: 4
-
first():
- Retorna el primer element de l'RDD.
rdd = sc.parallelize([1, 2, 3, 4]) result = rdd.first() print(result) # Sortida: 1
-
take(n):
- Retorna els primers 'n' elements de l'RDD.
rdd = sc.parallelize([1, 2, 3, 4]) result = rdd.take(2) print(result) # Sortida: [1, 2]
-
reduce(funció):
- Agrega els elements de l'RDD utilitzant una funció de reducció.
rdd = sc.parallelize([1, 2, 3, 4]) result = rdd.reduce(lambda x, y: x + y) print(result) # Sortida: 10
Exemple Pràctic
A continuació, es mostra un exemple pràctic que combina transformacions i accions per processar un RDD.
from pyspark import SparkContext # Crear un context de Spark sc = SparkContext("local", "Transformacions i Accions") # Crear un RDD rdd = sc.parallelize([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) # Aplicar transformacions rdd2 = rdd.filter(lambda x: x % 2 == 0).map(lambda x: x * 2) # Aplicar una acció result = rdd2.collect() # Mostrar el resultat print(result) # Sortida: [4, 8, 12, 16, 20] # Aturar el context de Spark sc.stop()
Exercicis Pràctics
-
Exercici 1:
- Crea un RDD amb els números de l'1 al 20.
- Filtra els números que són divisibles per 3.
- Multiplica cada número resultant per 5.
- Recull els resultats en una llista i imprimeix-la.
-
Exercici 2:
- Crea un RDD amb una llista de paraules.
- Utilitza
flatMap
per dividir cada paraula en caràcters. - Filtra els caràcters que són vocals.
- Utilitza
distinct
per obtenir les vocals úniques. - Recull els resultats en una llista i imprimeix-la.
Solucions
-
Solució Exercici 1:
rdd = sc.parallelize(range(1, 21)) rdd2 = rdd.filter(lambda x: x % 3 == 0).map(lambda x: x * 5) result = rdd2.collect() print(result) # Sortida: [15, 30, 45, 60, 75, 90]
-
Solució Exercici 2:
rdd = sc.parallelize(["apple", "banana", "cherry"]) rdd2 = rdd.flatMap(lambda x: list(x)).filter(lambda x: x in 'aeiou').distinct() result = rdd2.collect() print(result) # Sortida: ['a', 'e', 'i', 'o', 'u']
Resum
En aquesta secció, hem après sobre les transformacions i les accions en Apache Spark. Les transformacions són operacions "lazy" que creen nous RDDs, mentre que les accions són operacions que triguen a executar-se i retornen un valor o escriuen dades. Hem vist diversos exemples pràctics i exercicis per reforçar aquests conceptes. En el proper tema, explorarem els DataFrames de 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